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
相关产品推荐
相关产品推荐

