SQL Server和MySQL中生成一个日期范围的序列

SQL Server:  

SELECT CONVERT(varchar(15), DATEADD(DAY,number, '2024-01-01'), 23) days
FROM master..spt_values
WHERE type='p'
AND number<=DATEDIFF(DAY, '2024-01-01', '2024-03-01')
  1. master..spt_valuesmaster 数据库中的一个系统表,包含了一些常用的数字值,可以用来生成序列。
  2. WHERE type='p':在 spt_values 表中,type 字段表示值的类型,'p' 表示一个 placeholder 类型的值。
  3. numberspt_values 表中的一个列,包含了从 0 开始的一系列整数值。
  4. DATEDIFF(DAY, '2024-01-01', '2024-03-01'):这部分计算了从 '2024-01-01' 到 '2024-03-01' 之间的天数差。
  5. DATEADD(DAY, number, '2024-01-01'):这部分将 '2024-01-01' 作为起始日期,并根据 number 列中的值添加相应的天数,以生成一个日期序列。
  6. CONVERT(varchar(15), ..., 23):这部分将生成的日期转换为指定格式的字符串表示,其中 23 是日期时间样式代码,代表 yyyy-mm-dd 的格式。

MySQL: 

方法1:

SELECT 
    DATE_ADD('start_date', INTERVAL n DAY) AS generated_date
FROM (
    SELECT 
        (a + b * 10 + c * 100 + d * 1000) AS n
    FROM
        (SELECT 0 AS a 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) AS a,
        (SELECT 0 AS b 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) AS b,
        (SELECT 0 AS c 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) AS c,
        (SELECT 0 AS d 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) AS d
) AS numbers
WHERE DATE_ADD('start_date', INTERVAL n DAY) <= 'end_date';

方法2:

WITH RECURSIVE date_range AS (
  SELECT 'start_date' AS generated_date
  UNION ALL
  SELECT DATE_ADD(generated_date, INTERVAL 1 DAY)
  FROM date_range
  WHERE generated_date < 'end_date'
)
SELECT generated_date
FROM date_range;

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值