mysql - 我怎样才能得到上一个星期五和下一个星期四的日期?
问题描述
我正在尝试查询给定日期的上一个星期四和下一个星期五。如果过去的日期是星期五,那么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
解决方案
尝试这样的事情:
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
推荐阅读
- python - 为什么这个while循环没有在我的python代码中执行
- java - 想要使用带有图像作为输入和输出参数的 blob 压缩 jpeg
- angular - Angular 8 FCM 推送通知不起作用
- mysql - 从 MySQL 查询中获取反向匹配列表
- python - 带有强制关键字参数的自定义类的 Python 枚举
- java - 处理 Java 程序上的扫描程序异常
- c++ - ::lock() 函数如何在 std::weak_ptr 上工作?
- google-apps-script - 实时获取 Google Form(Quiz) 分数
- c# - 使用 ASP.NET 通过 SQL 表显示存储在文本框中的数据
- ios - 如何使用 iOS 声音进行推送通知?