Как я могу получить предыдущую пятницу и следующий четверг, учитывая дату? - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь сделать запрос в предыдущий четверг, а также в следующую пятницу, учитывая определенную дату. Если дата прошла в пятницу, то PrevFriday должна быть текущей датой. Точно так же, если переданная дата является четвергом, тогда nextThursday должна быть датой, которая была передана.

Я видел некоторые другие решения на этом сайте, которые включают использование смещения WEEKDAY() на некоторый интервал, но это работает только тогда, когда дата статична. Поскольку я собираюсь пропустить столбец WorkDate через это позже, мне нужно, чтобы это работало для каждой даты, а не только для конкретных дат.

В настоящее время у меня есть запрос, который работает ТОЛЬКО на сегодняшний день, а не диапазон дат.

1

SELECT '2019-05-16' + INTERVAL -3 - weekday('2019-05-16') DAY AS PrevFriday,
       '2019-05-16' + INTERVAL 3 - weekday('2019-05-16') DAY AS NextThursday

Этот код выводит ожидаемый результат, но если мы изменим дату, которую мы передаем завтра:

2

SELECT '2019-05-17' + INTERVAL -3 - weekday('2019-05-17') DAY AS PrevFriday,
       '2019-05-17' + INTERVAL 3 - weekday('2019-05-17') DAY AS NextThursday

ОЖИДАЕМЫЙ вывод для первого куска кода:

PrevFriday -> 2019-05-10, NextThursday -> 2019-05-16

ОЖИДАЕМЫЙ выход для второго куска кода:

PrevFriday -> 2019-05-17, NextThursday -> 2019-05-23

Но НАСТОЯЩИЕ результаты:

PrevFriday -> 2019-05-10, NextThursday -> 2019-05-16

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

Попробуйте что-то вроде этого:

select t.*
    , t.dt + interval (7 + 3 - weekday(t.dt)) % 7 day as NextThursday
    , t.dt - interval (7 - 4 + weekday(t.dt)) % 7 day as PrevFriday
from test t

Основная идея заключается в использовании оператора по модулю % 7, поэтому мы никогда не добавляем и не вычитаем более 6 дней.

Данные испытаний:

create table test(
  d char(2),
  dt date
);
insert into test(d, dt) values
('mo', '2019-05-13'),
('tu', '2019-05-14'),
('we', '2019-05-15'),
('th', '2019-05-16'),
('fr', '2019-05-17'),
('su', '2019-05-18'),
('so', '2019-05-19');

Результат:

d  | dt         | NextThursday | PrevFriday
---|------------|--------------|-----------
mo | 2019-05-13 |   2019-05-16 | 2019-05-10
tu | 2019-05-14 |   2019-05-16 | 2019-05-10
we | 2019-05-15 |   2019-05-16 | 2019-05-10
th | 2019-05-16 |   2019-05-16 | 2019-05-10
fr | 2019-05-17 |   2019-05-23 | 2019-05-17
su | 2019-05-18 |   2019-05-23 | 2019-05-17
so | 2019-05-19 |   2019-05-23 | 2019-05-17

ДБ-Fiddle demo

0 голосов
/ 16 мая 2019
IF WEEKDAY(DateVar) = 4 then --Friday logic
    PrevFriday = DateVar
    NextThursday =  DATE_ADD(DateVar, INTERVAL 6 DAY);
ELSEIF WEEKDAY(DateVar) = 3 THEN --Thursday logic
    PrevFriday = DATE_ADD(DateVar, INTERVAL -6 DAY)
    NextThursday = DateVar;
ELSE
    -- logic to ind the Prev Friday and Next Thursday; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...