#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<>скрипка.