如何在MySQL中检查日期是否是该月的第2个或第4个星期日?

时间:2016-03-14 07:52:08

标签: mysql mysql-workbench

我可以检查提供的日期是否是该月的第二个或第四个星期日?

E.g: 假设我进入2016年3月13日,然后是3月份的第2个星期日。那么我怎样才能使用MySQL来了解它?

3 个答案:

答案 0 :(得分:6)

这是一个解决方案:

SET @var = date '2016-03-13';
select 
    sum( month(@var - INTERVAL 7 * t.a DAY) = month(@var) ) as WeekOfMonth, 
    dayname(@var) as Weekday
from (select 0 as a union select 1 union select 2 union select 3 union select 4) as t;

输出:

mysql> SET @var = date '2016-03-13';
Query OK, 0 rows affected (0.00 sec)

mysql> select
    -> sum( month(@var - INTERVAL 7 * t.a DAY) = month(@var) ) as WeekOfMonth,
    -> dayname(@var) as Weekday
    -> from (select 0 as a union select 1 union select 2 union select 3 union select 4) as t;
+-------------+---------+
| WeekOfMonth | Weekday |
+-------------+---------+
|           2 | Sunday  |
+-------------+---------+
1 row in set (0.00 sec)

要在您的环境中使用,只需将“@var”替换为您的日期输入。

答案 1 :(得分:5)

鉴于xDATEDATETIME

DAYNAME(x) = 'Sunday' AND
FLOOR((DAYOFMONTH(x) + 6 ) / 7) IN (2, 4)

2,4 - 第2和第4个星期日。

FLOOR... - 给出了哪个星期。

因此,此代码可以很容易地适应一周的不同日期和一个月的不同周。

答案 2 :(得分:3)

一般功能

这是一个回答&#34的更一般问题的函数; n的值是多少,其中我提供的日期是该月的第n个工作日发生"

CREATE FUNCTION getNWhereDateIsNthWeekdayInMonth(`date` DATE)
RETURNS INT DETERMINISTIC BEGIN
  DECLARE firstOfMonthDate DATE;
  DECLARE dateDayOfMonth, firstOfMonthWeekday, dateWeekday, n INT;
  SET dateDayOfMonth = DAYOFMONTH(`date`); -- 1-31
  SET firstOfMonthDate = LAST_DAY(`date` - INTERVAL 1 MONTH) + INTERVAL 1 DAY;
  SET firstOfMonthWeekday = DAYOFWEEK(firstOfMonthDate); -- 1=Sun,...,7=Sat
  SET dateWeekday = DAYOFWEEK(`date`);                   -- 1=Sun,...,7=Sat
  SET n = ABS(
              dateDayOfMonth -- min=1,max=31
              - ((dateWeekday - firstOfMonthWeekday) % 7 -- min=-6,max=6
                 + 7) % 7 -- min=0,max=6
              - 1 -- min=-6,max=30
          )     -- min=0,max=30
          DIV 7 -- min=0,max=4
          + 1;  -- min=1,max=5*/
  RETURN n;
END//

具体用法

要回答您的问题,可以使用该功能(例如在SELECT内),如下所示:

-- The following expression evaluates to TRUE if the supplied date is the
-- 2nd or 4th occurrence of the weekday in the month, or FALSE otherwise.
getNWhereDateIsNthWeekdayInMonth('2016-03-13') IN (2, 4)

演示

这是一个演示,显示了各种值的使用函数:SQL Fiddle demo