本月的第N个工作日

时间:2013-08-21 18:43:52

标签: mysql

我想做的伪代码:

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

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

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

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

4 个答案:

答案 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()函数查找它是哪一天

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