给定的最小和最大日期为:
最短日期:2023-06-19 09:54:23.000
最大日期:now()::timestamp(0)-interval '1 year'
预期输出:
start_date end_date
-------------------------------------------
2023-12-01 00:00:00.000 2023-12-09 23:59:59.999
2023-11-01 00:00:00.000 2023-11-30 23:59:59.999
2023-10-01 00:00:00.000 2023-10-31 23:59:59.999
2023-09-01 00:00:00.000 2023-09-30 23:59:59.999
2023-08-01 00:00:00.000 2023-08-31 23:59:59.999
2023-07-01 00:00:00.000 2023-07-31 23:59:59.999
2023-06-01 00:00:00.000 2023-06-30 23:59:59.999
我的尝试:
with cte
as
(
SELECT days
from generate_series('2023-06-19 09:54:23.000',now()::timestamp(0)-interval '1 year', '1 month') days
order by days desc
)
select date_trunc('MONTH', days::date)::timestamp(0) start_date,
(date_trunc('month', days::date)::timestamp(0) + interval '1 month -1 millisecond') end_date
from cte;
以下是上述查询结果中缺失的日期。
start_date end_date
--------------------------------------------------
2023-12-01 00:00:00.000 2023-12-09 23:59:59.999
为什么我需要这个日期条目? - 我希望第一个条目包含当前日期- 1 year
条目和月份开始日期。该日期应为结束日期,其月份开始日期应为系列的开始日期。current - 1 year
如果当前日期是2024-12-22
则输出应该是:
start_date end_date
--------------------------------------------------
2023-12-01 00:00:00.000 2023-12-22 23:59:59.999
如果当前日期是2024-01-01
则输出应该是:
start_date end_date
--------------------------------------------------
2023-01-01 00:00:00.000 2023-01-01 23:59:59.999
扩大
generate_series()
范围并用来least()
切换最终日期:db<>fiddle 上的演示
仅在外部查询中使用
order by
,否则 Postgres 不保证它遵循子查询和 CTE 的顺序。您只需更改间隔并删除一个月(参见示例)即可获得完整的 moth 集,
添加发送 cte 来获取上个月,您需要区分上个月和其余月份
小提琴
根据您的预期用途,您可能希望生成tsrange(时间戳范围)而不是单独的日期。(参见演示)
关于范围的说明:范围可以包括或排除范围开始或范围结束。以上创建了包括
tsrange
范围开始和排除范围结束的。读取值时请记住,对于范围结束,这意味着最多但不包括该值。因此,上面的第一行表示从“2023-12-01 00:00:00”开始的所有时间,直到但不包括“2023-12-10 00:00:00”关于演示的说明:演示显示范围结束时间比指示的预期值多 1 天。这是因为它在 UTC 时区运行,因为这是db<>fiddle服务器上的设置。(它位于英国)。日期已更改为 2024-12-10。