我想做的伪代码:
SELECT * FROM table WHERE NTH_DAY(DATE(table_date)) = NTH_DAY($input_date);
字符串
我想确定给定日期的第n个工作日是什么。例如,如果输入“2013-08-30”,它应该返回5,因为它是该工作日(星期五)在该月的第五次出现。
我已经阅读了无数类似的问题,但大多数人都在寻找相反的,例如,他们想找到第五个星期五的日期,而我想确定日期的第n个数字是什么。
有人能解释一下这在MySQL查询中是否可能以及如何做到这一点吗?
5条答案
按热度按时间blpfk2vs1#
要找出一个给定的“第n”是哪一天是相当容易的:
字符串
你也可以使用“整数”算法来实现这一点:
型
e5nqia272#
这将给予星期的数字(实际上与第五个星期五或第五个星期一相同)
字符串
使用Weekday()函数查找当前日期
Fiddle,网址:http://www.sqlfiddle.com/#!2/7a 8b 6/2/0
l2osamch3#
我会把我的两分钱和第三个选项放在一起,这个选项是基于每天的第一天,然后加上7的倍数,得到最终的结果。
字符串
型
其中weekNumber为1到5,dayOfWeek为1到7(1 = Sun),monthOfYear为1到12。
查看日期是否为4月的第二个星期二:
型
让我们把它分解一下。这一行获取传入的日期的月份的第一天。
型
此检查确保日期具有正确的星期几和正确的月份(以防用户传入的日期甚至不是正确的星期几)。
型
现在是最重要的一个:
型
为了得到我们需要加到1上以得到日期的量,我们计算我们正在查看的dayOfWeek,减去该月福尔斯的第一天所在的星期几,以得到偏移量mod 7((dayOfWeek-DayOfWeek(first))% 7)。
注意,因为一个月的第一天可能会在我们看到的前一天或当天,我们添加了一个额外的7,然后以7为模。这是必要的,因为MySQL的Mod函数不能正确计算mod。即-1% 7应该是6,但MySQL返回-1。添加7并取模确保结果总是正确的。
总结如下:
型
然后我们加上1,以及需要多少个7的倍数才能得到正确的一周。
ef1yzkbh4#
字符串
这将始终给予您当前日期在一个月中的第n次出现次数。例如,如果当前日期是星期五,并且它在这个月中出现了第3次。它将返回3。如果您将GETDATE()替换为Date变量或列名,它将返回该日期在相应月份中的出现次数。
c2e8gylq5#
老实说,如果你需要做这种查询,我会简单地构建一个包含所有日期的表,你可以从中进行查找。
使用MySQL 8.0,你可以:
字符串
参见:DBFIDDLE
或者,对于MSSQL变体:DBFIDDLE MSSQL