如何使用SQL语句生成一个月的日期列表

如何在SQL中生成一个月的日期列表

大部分的日期列表通常使用 LocalDate 类进行日期计算,并于循环中获得整月的日期列表。

本文提供一种新的方式,即直接通过SQL语句获取当前月份的所有日期,思路如下

  1. 生成连续的日期序列

首先,使用 SELECT 子查询和 DATE_ADD 函数生成一个连续的日期序列,从指定月份的第一天开始。

子查询中使用了三个 UNION ALL,每个 UNION ALL 语句生成一个数字序列,从 0 到 9,分别代表个位、十位和百位。通过三个 CROSS JOIN 进行笛卡尔积,组合成了 0 到 999 的数字序列。

DATE_ADD 函数用于在指定日期上添加指定的天数,这里用来生成从指定月份的第一天开始的日期序列。

  1. 限制日期范围

使用 WHERE 子句限制生成的日期序列,确保日期不超过指定月份的最后一天。

  1. 按照日期排序

使用 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月的所有日期,效果如下:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值