【问题标题】:Add timezone to timestamp in PostgreSQL (not convert to this timezone)在 PostgreSQL 中将时区添加到时间戳(不转换为此时区)
【发布时间】:2018-07-31 09:34:45
【问题描述】:

我有 3 个类型为 VARCHAR(包含时区,例如“欧洲/罗马”)、DATEINTERVAL 的单独字段。我想在查询中组合它们,以便得到TIMESTAMP WITH TIME ZONE。制作这个值的规则是:

给定时区指定日期的中午,负 12 小时加给定间隔(处理 DST 需要这个 -12 小时)。

显然加/减INTERVAL 不是问题。我的问题是我不明白如何创建“给定时区指定日期的中午”。

一个简单的例子:

  • 如果我有时区字段“欧洲/罗马”
  • 日期为 2018 年 3 月 24 日(该时区 DST 切换日期)
  • 间隔为“1 小时”

计算应该是这样的:

  1. 创建指定日期的中午:2018-03-24 12:00:00 at 'Europe/Rome' time zone
  2. 减去 INTERVAL '12 hours',结果是 2018-03-24 01:00:00 在“欧洲/罗马”时区(由于 DST)
  3. 添加INTERVAL '1 hour',最终结果为“欧洲/罗马”时区2018-03-24 02:00:00

第 1 点我该怎么做?

附:我无法更改数据架构。它来自加载到 postgres 中的GTFS 数据。简而言之,这个模式的特点是它将时区、日期和时间间隔存储在 3 个不同的表中:agencycalendar_datesstop_times(好吧,时区可能在其他表中,但这对于这个问题并不重要)。

【问题讨论】:

  • 您使用哪种语言?
  • @paulh 我需要在 SQL 中执行此操作,因为此结果字段是物化视图的一部分

标签: postgresql datetime timezone gtfs


【解决方案1】:

您的示例在语法上不正确,但您的问题似乎是 PostgreSQL 将带有日期的字符串文字解释为 timestamp with time zone

但是你必须走另一条路:你想要中午十二点作为timestamp without timezone,然后使用AT TIME ZONE 'Europe/Rome' 来获得一个包含“noon as it is in Rome”的绝对时间戳(在 PostgreSQL 中称为timestamp with time zone),然后加上小时。

显示的结果将取决于您的会话时区。

让我们使用 UTC 以便我们得到相同的结果并在 SQL 中编写上述内容:

SET timezone=UTC;

SELECT '2018-03-24 12:00:00'::timestamp without time zone
   AT TIME ZONE 'Europe/Rome'
   + INTERVAL '1 hour';

        ?column?        
------------------------
 2018-03-24 12:00:00+00
(1 row)

【讨论】:

  • 这需要您知道欧洲/罗马当时是UTC+1。
  • @OrangeDog 专门针对给定时间间隔提出的问题。
猜你喜欢
  • 1970-01-01
  • 2021-02-10
  • 2021-09-22
  • 2011-05-10
  • 2018-08-06
  • 2023-03-28
  • 2016-12-16
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多