You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL如何获取起始日期与结束日期之间的所有日期

在PostgreSQL中生成两个日期之间的所有日期(包含起止)

嘿,这个需求在PostgreSQL里其实有好几种实用的实现方式,我给你列两个最常用的,你可以根据自己的场景来选:

方法1:使用generate_series(最简洁)

这是PostgreSQL内置的生成序列函数,处理日期范围简直是得心应手。直接指定起始日期、结束日期和步长(1天)就可以了:

SELECT generate_series(
    '2018-04-01'::date,
    '2018-04-30'::date,
    '1 day'::interval
)::date AS date_range;

这里加::date是为了确保输出结果是纯日期类型(默认情况下,如果传入的是date类型但步长用interval,返回的可能是带时区的timestamp,转一下更稳妥)。

如果担心起始日期可能大于结束日期的情况,可以用LEAST和GREATEST来兼容:

SELECT generate_series(
    LEAST('2018-04-01'::date, '2018-04-30'::date),
    GREATEST('2018-04-01'::date, '2018-04-30'::date),
    '1 day'
)::date AS date_range;

方法2:使用递归CTE(更灵活)

如果你需要在生成日期的同时做一些额外的逻辑处理,递归CTE会是更好的选择,它的可读性和扩展性都很强:

WITH RECURSIVE date_range AS (
    -- 初始化起始日期
    SELECT '2018-04-01'::date AS date_val
    UNION ALL
    -- 递归生成下一天的日期,直到小于结束日期
    SELECT date_val + 1
    FROM date_range
    WHERE date_val < '2018-04-30'::date
)
SELECT date_val FROM date_range;

这里date_val + 1是PostgreSQL里对日期加1天的简便写法,和date_val + INTERVAL '1 day'::date效果完全一致。

这两种方法都能完美生成你需要的日期范围,generate_series胜在简洁高效,递归CTE则适合需要自定义逻辑的场景~

内容的提问来源于stack exchange,提问作者Javier Fernandez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:42