我正在尝试查询给定日期的上一个星期四以及下一个星期五。如果传递的日期是星期五,则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
第一段代码的EXPECTED输出:
PrevFriday -> 2019-05-10
,
NextThursday -> 2019-05-16
第二段代码的EXPECTED输出:
PrevFriday -> 2019-05-17
,
NextThursday -> 2019-05-23
但是实际结果是:
PrevFriday -> 2019-05-10
,
NextThursday -> 2019-05-16
答案 0 :(得分:2)
尝试这样的事情:
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
答案 1 :(得分:0)
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;