Как проверить, является ли дата 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 скрипку демо