如何获得给定日期的前一个星期五和下个星期四?

时间:2019-05-16 14:02:56

标签: mysql sql

我正在尝试查询给定日期的上一个星期四以及下一个星期五。如果传递的日期是星期五,则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-10NextThursday -> 2019-05-16

第二段代码的EXPECTED输出:

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

但是实际结果是:

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

2 个答案:

答案 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

db-fiddle demo

答案 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;