MySQL: получение даты на основе n-го дня недели определенного месяца / года

#mysql #sql

#mysql #sql

Вопрос:

Мне нужно восстановить / создать дату на основе n-го дня недели любого заданного года и месяца.

Например. Я хочу знать, какой день будет третьим понедельником декабря 2020 года.

Есть предложения?

Ответ №1:

Протестируйте выражение:

 SELECT (@year*10000   @month*100   1)   INTERVAL 7 * @weeknumber   @weekday - WEEKDAY(@year*10000   @month*100   1) - 7*(@weekday > WEEKDAY(@year*10000   @month*100   1) - 1) DAY
  

где

@year — год (2020 в примере вопроса)

@month — месяц (12)

@weekday — необходимый день недели (0) (0-понедельник, 1-вторник, … 6-воскресенье)

@weeknumber — номер необходимого дня в месяце (3)

Ответ №2:

Одним из методов является метод грубой силы. Сгенерируйте все даты в месяце и выберите нужную:

 with recursive dates as (
      select date('2020-12-01') as dte
      union all
      select dte   interval 1 day
      from dates
      where dte < last_day(dte)
    )
select *
from (select d.*, dayname(dte) as dname,
            row_number() over (partition by dayname(dte) order by dte) as cnt
      from dates d
     ) d
where cnt = 3 and dname = 'Monday';
  

Вы могли бы, конечно, вместо этого использовать таблицу календаря. Такой подход позволяет легко продлить запрос — на первый месяц и четвертый четверг, если это то, что вы действительно хотите.

Вот db<>скрипка.