首页 > 解决方案 > 如何在 mySQL 中获取 DATETIME 列的结束周

问题描述

我正在使用 MySQL,并且在从 DATETIME 列获取周末日期时遇到问题,该列的周末被认为是星期日,

我的表如下所示:

唯一身份 日期
123 2020-07-13 17:03:31.035
456 2021-01-01 15:02:19.029
789 2020-08-02 18:07:14.011

我需要为星期天结束的每一行获取星期。时间不需要。因此 2021-01-01 的最终结果将显示 2021-01-03,因为该周在星期日结束。有谁知道为此使用什么功能?

标签: mysqlsqldatedatetimeweek-number

解决方案


这是评论中Akina建议的详细说明(我希望):

SELECT *,
       dt + INTERVAL 6 DAY add6 /*add 6 day ahead*/,
       DAYNAME(dt + INTERVAL 6 DAY) dn6 /*6 day ahead dayname*/,
       dt + INTERVAL (6 - wkd) DAY nxtsun /*add 6 day ahead then subtract weekday value from date column*/,
       DAYNAME(dt + INTERVAL (6 - wkd) DAY) nxtsundn
FROM
(SELECT *, 
       DATE(date) dt,
       DAYNAME(date) dn,
       WEEKDAY(date) wkd
FROM mytable) A;

让我们从您的数据样本中取出第二行来说明正在发生的事情。上面的基本查询:

SELECT *, 
       DATE(date) dt,
       DAYNAME(date) dn,
       WEEKDAY(date) wkd
FROM mytable

将返回以下内容。

唯一身份 日期 dn
456 2021-01-01 15:02:19 星期五 4

请注意,WEEKDAY(date)(如表中的别名wkd)返回 4。这意味着它是Friday. 根据文档WEEKDAY()函数返回如下:

0 = Monday
1 = Tuesday
2 = Wednesday
3 = Thursday
4 = Friday
5 = Saturday
6 = Sunday

将 6 天间隔添加到当前WEEKDAY()结果将转到当前date值的下一个相同日期的前一天。所以WEEKDAY(2021-01-01)which is on ,在提前 6 天添加后Friday变为2021-01-07which is on 。Thursday减去之前获得的WEEKDAY()值,操作变为DATE + INTERVAL (6 - 4) DAY,实际上变为DATE + INTERVAL 2 DAY

这是一个小提琴


推荐阅读