2

我想做的伪代码:

SELECT * FROM table WHERE NTH_DAY(DATE(table_date)) = NTH_DAY($input_date);

我想确定给定日期该月的第 n 个工作日。例如,如果给定输入“2013-08-30”,它应该返回 5,因为它是该工作日(星期五)在该月中的第五次出现。

我一直在阅读无数类似的问题,但大多数人都在寻找相反的问题,例如他们想找到第五个星期五的日期,而我想确定日期的第 n 个数字是多少。其他问题似乎是我所追求的,但它们使用不同的编程语言,我不明白。

有人可以解释一下这在 MySQL 查询中是否可行以及如何做到这一点?

4

4 回答 4

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
于 2013-08-21T18:55:56.200 回答
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 = 太阳),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 才能到达正确的一周。

于 2015-07-03T21:30:31.090 回答
1
select ceiling(DATEPART(day, GETDATE())/7.0)

这将始终为您提供一个月中当前日期的第 n 个出现次数。例如,如果当天是星期五,并且它发生在本月的第三次。它将返回 3。如果将 GETDATE() 替换为 Date 变量或列名,它将返回相应月份中该日期出现的日期。

于 2019-12-20T11:03:19.907 回答
0

这将给出周数(实际上与第 5 个星期五或第 5 个星期一相同)

SELECT WEEK(dateasd,5) - 
WEEK(DATE_SUB(dateasd, INTERVAL DAYOFMONTH(dateasd)-1 DAY),5)
from test

使用 Weekday() 函数查找今天是哪一天

小提琴 http://www.sqlfiddle.com/#!2/7a8b6/2/0

于 2013-08-21T18:55:09.100 回答