如何在 mySQL 中获取 DATETIME 列的结束周

Posted

技术标签:

【中文标题】如何在 mySQL 中获取 DATETIME 列的结束周【英文标题】:How to get the end week of a DATETIME column in mySQL 【发布时间】:2021-12-11 20:39:15 【问题描述】:

我正在使用 mysql,但在从 DATETIME 列获取周末日期时遇到问题,该列将周末视为星期日,

我的桌子是这样的:

Unique_ID Date
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,因为该周在星期日结束。有谁知道这个用什么函数?

【问题讨论】:

SELECT DATE(datetime_column) + INTERVAL 6 - WEEKDAY(datetime_column) DAY @Akina 这行得通!太感谢了。我希望我没有问太多,但你能描述一下 INTERVAL 6 - WEEKDAY 和 DAY 函数在做什么吗?我不太明白。 WEEKDAY 函数返回 DOW 的数量。 6 - WEEKDAY(datetime_column) 是一个算术表达式,用于计算到周日的天数。 + INTERVAL xx DAY 将此天数添加到日期中。 【参考方案1】:

这是对 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

将返回以下内容。

Unique_ID Date dn wkd
456 2021-01-01 15:02:19 Friday 4

请注意WEEKDAY(date)(在表中别名为wkd)返回4。这意味着它是Friday。 According to the docs, WEEKDAY() 函数返回如下:

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

将 6 天间隔添加到当前 WEEKDAY() 结果将转到当前 date 值的前一天的前一天。因此,WEEKDAY(2021-01-01) 位于 Friday 上,在提前 6 天添加后变为 2021-01-07 位于 Thursday 上。减去先前获得的WEEKDAY() 值,运算变为DATE + INTERVAL (6 - 4) DAY,实际上变为DATE + INTERVAL 2 DAY

Here's a fiddle

【讨论】:

以上是关于如何在 mySQL 中获取 DATETIME 列的结束周的主要内容,如果未能解决你的问题,请参考以下文章

MySQL SELECT WHERE datetime 匹配时间(不一定是天)

如何在没有'id'列的MySql中获取最后插入的记录?

如何在 Pandas 中转换 datetime 列的时区?

获取 DataFrame 的 Datetime 列的工作日/星期几

DateTime.MaxValue 在 mysql 中保存为零

如何使用 WordPress API 在 PHP 中获取 MySQL 表的列的最大值