【问题标题】:to_timestamp to store time zone datato_timestamp 存储时区数据
【发布时间】:2016-12-23 05:04:36
【问题描述】:

我有两列,一列名为“日期”,另一列名为“时间”。日期是日期数据类型,“时间”是字符数据类型。我正在使用以下查询来选择一个新的组合时间戳列

SELECT 
    to_timestamp(concat_ws(' ',air_date,air_time),'yyyy-MM-dd HH24:MI:SS') as datetime
FROM table1

这将返回正确的时间戳,但时区为“+00”。我想明确地告诉查询时区在“EST5EDT”中,以便我得到时区的“+04”或“+05”。我尝试了以下但收到错误

SELECT 
    to_timestamp(concat_ws(' ',air_date,air_time,'EST5EDT'),'yyyy-MM-dd HH24:MI:SS TZ') as datetime
FROM table1

错误:to_date 不支持“TZ”/“tz”/“OF”格式模式

SQL 状态:0A000

如何选择包含 EST5EDT 时区信息的时间戳列?

【问题讨论】:

  • 这不太行。当我这样做时会发生什么,它假设输入日期时间为“UTC”,然后将其转换为“EST5EDT”。我需要postgres先将输入时间解释为“EST5EDT”,然后再转换。
  • 对不起,错了,出于某种原因,我认为to_timestamp 返回timestamp without time zone。但是,timstamp input 支持您的格式,因此您可以使用像 concat_ws(' ',air_date,air_time,'EST5EDT')::timestamptz 这样的简单转换。
  • 据此它返回'带时区的时间戳',至少在 postgres 9.5 中:postgresql.org/docs/9.5/static/functions-formatting.html

标签: postgresql


【解决方案1】:

如果您只是将 yoru tz 添加到时间戳转换中,它将添加适当的小时数:

t=# select 
  concat_ws(' ','2016-08-16'::date,'10:00:00'::time,'EST5EDT')::timestamptz
, concat_ws(' ','2016-08-16'::date,'10:00:00'::time)::timestamptz;
       concat_ws        |       concat_ws
------------------------+------------------------
 2016-08-16 14:00:00+00 | 2016-08-16 10:00:00+00
(1 row)

如果我没听错的话,你想要相同的日期和时间加上 TZ“值”吗?那么这可能会有所帮助:

t=# set timezone = EST5EDT;
SET
t=# select 
  concat_ws(' ','2016-08-16'::date,'10:00:00'::time,'EST5EDT')::timestamptz
, concat_ws(' ','2016-08-16'::date,'10:00:00'::time)::timestamptz;
       concat_ws        |       concat_ws
------------------------+------------------------
 2016-08-16 10:00:00-04 | 2016-08-16 10:00:00-04
(1 row)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2023-02-23
    • 2011-08-20
    • 1970-01-01
    • 2015-05-06
    • 2019-12-29
    • 2020-07-17
    相关资源
    最近更新 更多