我可以检查提供的日期是否是该月的第二个或第四个星期日?
E.g: 假设我进入2016年3月13日,然后是3月份的第2个星期日。那么我怎样才能使用MySQL来了解它?
答案 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)
鉴于x
是DATE
或DATETIME
:
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