首页 > 解决方案 > 我怎样才能得到上一个星期五和下一个星期四的日期?

问题描述

我正在尝试查询给定日期的上一个星期四和下一个星期五。如果过去的日期是星期五,那么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

标签: mysqlsql

解决方案


尝试这样的事情:

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 演示


推荐阅读