如何在 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 匹配时间(不一定是天)
获取 DataFrame 的 Datetime 列的工作日/星期几