我想做的伪代码:
SELECT * FROM table WHERE NTH_DAY(DATE(table_date)) = NTH_DAY($input_date);
我想确定某个日期的第n个工作日是什么。例如,如果输入“2013-08-30”,它应该返回5,因为它是该月的工作日(星期五)的第五次出现。
我一直在阅读无数类似的问题,但大多数人正在寻找相反的情况,例如他们想要找到第五个星期五的日期,而我想确定第n个日期是多少。 Other questions似乎就是我所追求的,但他们使用的是不同的编程语言。
有人可以解释一下在MySQL查询中是否可以这样做以及如何做到这一点?
答案 0 :(得分:4)
要找到某一天的“第n”是相当容易的:
select (case when day(table_date) between 1 and 7 then 1
when day(table_date) between 8 and 14 then 2
when day(table_date) between 15 and 21 then 3
when day(table_date) between 22 and 28 then 4
else 5
end) as NthDay
您也可以使用“余数”算术:
select 1 + floor((day(table_date) - 1) / 7) ) as NthDay
答案 1 :(得分:1)
我要把我的两分钱扔到这里,第三个选项是基于找到每天的第一个,然后加上7的倍数来得到最终结果。
<强>功能强>
CREATE FUNCTION `ISNTHDAYINMONTH`(checkDate DATE, weekNumber INTEGER, dayOfWeek INTEGER, monthOfYear INTEGER) RETURNS INTEGER
NO SQL
DETERMINISTIC
BEGIN
DECLARE firstOfMonth DATE;
SET firstOfMonth = DATE_SUB(checkDate, INTERVAL DAYOFMONTH(checkDate) - 1 DAY); #Find the first day of the current month
IF DAYOFWEEK(checkDate) = dayOfWeek AND MONTH(checkDate) = monthOfYear #Make sure at least this matches
AND DAYOFMONTH(checkDate) = ((1 + (7 + dayOfWeek - DAYOFWEEK(firstOfMonth)) % 7) + 7 * (weekNumber - 1)) THEN #When the date matches the nth dayOfWeek day of the month
RETURN 1;
ELSE
RETURN 0; #Nope
END IF;
END
使用强>
SELECT ISNTHDAYINMONTH(datecol, weekNumber, dayOfWeek, monthOfYear);
其中weekNumber为1到5,dayOfWeek为1到7(1 = Sun),monthOfYear为1到12。
示例强>
检查datecol是否是4月的第二个星期二:
SELECT ISNTHDAYINMONTH(datecol, 2, 3, 4);
<强>计算强>
让我们分解吧。该行获取传递日期的月份的第一天。
SET firstOfMonth = DATE_SUB(checkDate, INTERVAL DAYOFMONTH(checkDate) - 1 DAY); #Find the first day of the current month
此检查可确保日期具有正确的星期几和正确的月份(以防用户通过的日期甚至不是一周中的正确日期。)
DAYOFWEEK(checkDate) = dayOfWeek AND MONTH(checkDate) = monthOfYear
现在是大人物:
DAYOFMONTH(checkDate) = ((1 + (7 + dayOfWeek - DAYOFWEEK(firstOfMonth)) % 7) + 7 * (weekNumber - 1))
为了获得我们需要添加到1以获取日期的金额,我们计算我们正在查看的dayOfWeek,减去当月第一天所在的星期几以获得偏移量mod 7(( dayOfWeek - DayOfWeek(第一次))%7)。
请注意,因为本月的第一天可能会在我们正在查看的前一天或之前登陆,所以我们会额外添加7,然后再加7。这是必需的,因为MySQL的Mod函数无法正确计算mod。即-1%7应为6,但MySQL返回-1。添加7并取模数可确保结果始终正确。
总结:
NumberToAddToOneToGetDateOfFirstWeekDay = (7 + DayOfWeek - DayOfWeek(firstDayOfMonth)) %
然后我们添加一个,以及如何到达正确的一周需要每7的倍数。
答案 2 :(得分:1)
select ceiling(DATEPART(day, GETDATE())/7.0)
这将始终为您提供一个月中当前日期的第n次出现次数。 例如,如果当前日期是星期五,并且它是本月第三次发生。它将返回3。 如果将GETDATE()替换为Date变量或列名,它将返回对应月份中该日期的某天。
答案 3 :(得分:0)
这将给出一周的数量(实际上与第五个星期五或第五个星期一相同)
SELECT WEEK(dateasd,5) -
WEEK(DATE_SUB(dateasd, INTERVAL DAYOFMONTH(dateasd)-1 DAY),5)
from test
使用Weekday()函数查找它是哪一天