如何在SQL中生成一个月的日期列表
大部分的日期列表通常使用 LocalDate
类进行日期计算,并于循环中获得整月的日期列表。
本文提供一种新的方式,即直接通过SQL语句获取当前月份的所有日期,思路如下
- 生成连续的日期序列
首先,使用 SELECT
子查询和 DATE_ADD
函数生成一个连续的日期序列,从指定月份的第一天开始。
子查询中使用了三个 UNION ALL
,每个 UNION ALL
语句生成一个数字序列,从 0 到 9,分别代表个位、十位和百位。通过三个 CROSS JOIN
进行笛卡尔积,组合成了 0 到 999 的数字序列。
DATE_ADD
函数用于在指定日期上添加指定的天数,这里用来生成从指定月份的第一天开始的日期序列。
- 限制日期范围
使用 WHERE
子句限制生成的日期序列,确保日期不超过指定月份的最后一天。
- 按照日期排序
使用 ORDER BY
对生成的日期序列按照日期排序。
代码如下:
SELECT dateList.date_range AS `monthDate`
FROM (SELECT DATE_ADD(CONCAT('2024-01', '-01'), INTERVAL n DAY) AS date_range
FROM (SELECT a.N + b.N * 10 + c.N * 100 AS N
FROM (SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) a /*10*/
CROSS JOIN (SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) b /*100*/
CROSS JOIN (SELECT 0 AS N
UNION ALL
SELECT 1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
UNION ALL
SELECT 4
UNION ALL
SELECT 5
UNION ALL
SELECT 6
UNION ALL
SELECT 7
UNION ALL
SELECT 8
UNION ALL
SELECT 9) c
WHERE a.N + b.N * 10 + c.N * 100 <= DATEDIFF(LAST_DAY(STR_TO_DATE(CONCAT('2024-01', '-01'), '%Y-%m-%d')), CONCAT('2024-01', '-01'))) days
ORDER BY date_range) dateList
ORDER BY dateList.date_range
代码中2024-01
部分可以替换为某年某月,可直接生成2024年01月的所有日期,效果如下: