代码之家  ›  专栏  ›  技术社区  ›  TomáÅ¡ Zato

根据时区将时间戳转换为日期

  •  0
  • TomáÅ¡ Zato  · 技术社区  · 6 年前

    SELECT
    CAST (to_timestamp_tz('2018-12-05T10:00:00+01:00', 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM') AS DATE) AS PRAGUE_TIME,
    CAST (to_timestamp_tz('2018-12-05T10:00:00+00:00', 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM') AS DATE) AS GMT_TIME
    FROM DUAL
    

    结果:

    PRAGUE_TIME          GMT_TIME
    2018-12-05 10:00:00  2018-12-05 10:00:00
    

    时间是相同的,尽管从+1时区偏移创建了一个时间。为了确定,我添加了对字符串的进一步转换:

    SELECT
    TO_CHAR(CAST (to_timestamp_tz('2018-12-05T10:00:00+01:00', 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM') AS DATE),'YYYY-MM-DD HH24:MI:SS') AS PRAGUE_TIME,
    TO_CHAR(CAST (to_timestamp_tz('2018-12-05T10:00:00+00:00', 'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM') AS DATE),'YYYY-MM-DD HH24:MI:SS') AS GMT_TIME
    FROM DUAL
    
    
    PRAGUE_TIME          GMT_TIME
    2018-12-05 10:00:00  2018-12-05 10:00:00
    

    TIMESTAMP DATE 不丢失时区信息?

    1 回复  |  直到 6 年前
        1
  •  3
  •   MT0    6 年前

    我怎样才能转换 TIMESTAMP DATE

    你不能。

    • A 只有年、月、日、小时、分钟和秒组件。
    • A 时间戳 具有所有这些组件加上纳秒和可选的时区或时区偏移组件。

    如果你从一个 时间戳 日期 日期 无法存储。

    你能做的就是转换所有的 时间戳 使用,例如, AT TIME ZONE 'UTC' :

    SELECT CAST( TIMESTAMP '2018-12-05 10:00:00+01:00' AT TIME ZONE 'UTC' AS DATE )
             AS PRAGUE_TIME_AS_UTC,
           CAST( TIMESTAMP '2018-12-05 10:00:00+00:00' AT TIME ZONE 'UTC' AS DATE )
             AS GMT_TIME_AS_UTC
    FROM   DUAL
    

    结果

    |   PRAGUE_TIME_AS_UTC |      GMT_TIME_AS_UTC |
    |----------------------|----------------------|
    | 2018-12-05T09:00:00Z | 2018-12-05T10:00:00Z |