📅  最后修改于: 2023-12-03 15:27:50.415000             🧑  作者: Mango
很多时候,我们需要在数据库中查询一周的数据,这时候就需要知道一周的第一天和最后一天,本篇文章就是介绍如何获取数据库中一周的第一天和最后一天的 SQL 查询。
使用 MySQL 内置函数 DATE_FORMAT()
,将当前时间减去 WEEKDAY()
的值再减去 6 即可。
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE()) DAY), '%Y-%m-%d') AS `week_start`;
结果示例:
+------------+
| week_start |
+------------+
| 2021-08-15 |
+------------+
和获取一周的第一天类似,只需将 6
改为 0
。
SELECT DATE_FORMAT(DATE_ADD(CURDATE(), INTERVAL 6 - WEEKDAY(CURDATE()) DAY), '%Y-%m-%d') AS `week_end`;
结果示例:
+------------+
| week_end |
+------------+
| 2021-08-21 |
+------------+
使用 PostgreSQL 内置函数 TO_CHAR()
,将当前时间减去 EXTRACT(DOW FROM )
的值即可。
SELECT TO_CHAR(CURRENT_DATE - EXTRACT(DOW FROM CURRENT_DATE) + 1, 'YYYY-MM-DD') AS week_start;
结果示例:
+------------+
| week_start |
+------------+
| 2021-08-15 |
+------------+
和获取一周的第一天类似,只需将 1
改为 7
。
SELECT TO_CHAR(CURRENT_DATE + (7 - EXTRACT(DOW FROM CURRENT_DATE)), 'YYYY-MM-DD') AS week_end;
结果示例:
+------------+
| week_end |
+------------+
| 2021-08-21 |
+------------+
使用 Microsoft SQL Server 内置函数 DATEADD()
和 DATEDIFF()
,将当前时间减去 DATEDIFF()
的值再减去 6 即可。
SELECT CONVERT(VARCHAR, DATEADD(week, DATEDIFF(week, 0, GETDATE()), 0), 23) AS week_start;
结果示例:
+------------+
| week_start |
+------------+
| 2021-08-15 |
+------------+
和获取一周的第一天类似,只需将 6
改为 5
。
SELECT CONVERT(VARCHAR, DATEADD(day, 5 - DATEDIFF(day, 0, GETDATE()) % 7, GETDATE()), 23) as week_end;
结果示例:
+------------+
| week_end |
+------------+
| 2021-08-21 |
+------------+
在上述示例中,我们使用了不同的数据库方言,但实现的逻辑相同,即通过内置函数获取当前时间的某些信息,再根据这些信息计算出一周的第一天和最后一天。
例如在 MySQL 中,我们使用 WEEKDAY()
函数获取当前日期是星期几,然后再用 DATE_SUB()
函数减去该值得到本周的第一天;类似地,用 DATE_ADD()
函数加上一周的天数再减去 WEEKDAY()
得到本周的最后一天。
在 PostgreSQL 和 Microsoft SQL Server 中,我们均使用了 EXTRACT()
函数获取当前日期是星期几,然后再用减法或加法将其转化为一周的第一天或最后一天。
此外,不同数据库也有不同的函数来格式化日期,例如在 MySQL 中,我们使用 DATE_FORMAT()
函数格式化日期,而在 Microsoft SQL Server 中,则使用 CONVERT()
函数。