作为更大的 Postgres 查询的一部分,我生成两个给定时间戳之间的所有年份 (
timestamptz
):
select to_char(generate_series, 'YYYY') from generate_series(
'2022-06-14 11:00:00.000+00'::timestamptz,
'2023-06-14 11:00:00.000+00'::timestamptz,
'1 year' );
返回:
'2022'
'2023'
问题是,如果两个时间戳之间的时间间隔少于一年,则仅返回第一年。我需要一组所有涉及的年份,无论两个时间戳之间的间隔如何,例如:
select to_char(generate_series, 'YYYY') from generate_series(
'2022-06-14 11:00:00.000+00'::timestamptz,
'2023-06-13 11:00:00.000+00'::timestamptz,
'1 year' );
仅退货:
'2022'
但我希望它能回来:
'2022'
'2023'
有什么方法可以实现这一点吗?
timestamptz
(timestamp with time zone]
) 值的年份没有严格确定。纽约还是2024年,我在维也纳祝“2025年新年快乐”。date
或 timestamp
(timestamp without time zone
) 是确定性的。
为了避免极端情况问题,您必须以一种或另一种方式定义查询的时区。
这是一种方法:
SELECT generate_series(EXTRACT('year' FROM '2022-06-14 11:00+0'::timestamptz AT TIME ZONE 'Europe/Vienna')::int
, EXTRACT('year' FROM '2023-06-13 11:00+0'::timestamptz AT TIME ZONE 'Europe/Vienna')::int) AS the_year;
这是另一个:
SELECT EXTRACT('year' FROM ts)::int AS the_year
FROM generate_series(date_trunc('year', '2022-06-14 11:00+0'::timestamptz, 'Europe/Vienna')
, date_trunc('year', '2023-06-13 11:00+0'::timestamptz, 'Europe/Vienna')
, interval '1 year') ts;
自 Postgres 12 起,date_trunc()
允许第三个参数传递 时区 - 显然,这仅对 timestamptz
有意义。
替换为您的时区,或使用时间戳值开始。
假设第二个时间戳保证在第一个时间戳之后,或者你必须做更多的事情/定义如何处理它。
基础知识: