生成两个时间戳之间的所有年份

问题描述 投票:0回答:1

作为更大的 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'

有什么方法可以实现这一点吗?

sql postgresql timestamp generate-series postgres-14
1个回答
0
投票

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
有意义。

替换为您的时区,或使用时间戳值开始。

假设第二个时间戳保证在第一个时间戳之后,或者你必须做更多的事情/定义如何处理它。

基础知识:

  • 忽略 Postgres 时间戳的时区
  • 在 PostgreSQL 中生成两个日期之间的时间序列
© www.soinside.com 2019 - 2024. All rights reserved.