Как проверить, является ли дата 2-м или 4-м воскресеньем месяца в MySQL?
могу ли я проверить, является ли поставляемая дата вторым или четвертым воскресеньем месяца?
например: Предположим, я ввел 13/3/2016, а затем его 2-е воскресенье в марте. Итак, как я могу узнать это с помощью MySQL?
3 ответов
вот решение:
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 " на ввод даты.
учитывая, что x
это DATE
или DATETIME
:
DAYNAME(x) = 'Sunday' AND
FLOOR((DAYOFMONTH(x) + 6 ) / 7) IN (2, 4)
2,4
-- для 2-го и 4-го воскресенья.
FLOOR...
-- дает какую неделю месяца.
таким образом, этот код можно легко адаптировать к другому дню недели и различным неделям месяца.
Основные Функции
вот функция, которая отвечает на более общий вопрос "каково значение 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 скрипку демо