Следующий запрос возвращает все TUESDAYS между датами начала и окончания. В этом случае мне также понадобится вернуть все остальные ВТОРНИК в этом случае.
select * from
(select adddate('1970-01-01',t4*10000 + t3*1000 + t2*100 + t1*10 + t0) DATES from
(select 0 t0 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0,
(select 0 t1 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1,
(select 0 t2 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2,
(select 0 t3 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3,
(select 0 t4 union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v
where DATES between '2018-05-21' and '2018-08-31'
and dayname(DATES) in ('TUESDAY');
DATES имеет все даты в ВТОРНИК. Теперь мне нужно, как извлечь все другие ВТОРНИК. По какой-то причине это убегает от меня.
измените предложение where where
where DATES between '2018-05-21' and '2018-08-31'
and dayname(DATES) in ('TUESDAY')
and (date_format(DATES,'%U')%2 = 0);
что функция date_format() даст вам неделю с года 00 до 53, а затем выполнит unit тест против 2. Всякий раз, когда это "0", это будет даже номер недели. Всякий раз, когда это "1", это будет "нечетный" номер недели.
Включите t0
в подзапрос, а затем добавьте выражение mod
в where
:
where DATES between '2018-05-21' and '2018-08-31' and t0 mod 2 = 1
Обратите внимание, что это будет произвольно выбирать первый или второй вторник в период для начала подсчета (ваш вопрос не ясен, если это нормально).
На самом деле существует довольно простой способ получить правильный счет:
where DATES between '2018-05-21' and '2018-08-31' and
floor(datediff(dates, '2018-05-21') / 7) mod 2 = 0
Это рассчитывается по неделям после первой даты и возвращает только даты с каждой другой недели.