【问题标题】:Convert date oracle's timestamp to ISO-8601 date datatype [duplicate]将日期 oracle 的时间戳转换为 ISO-8601 日期数据类型 [重复]
【发布时间】:2021-11-19 13:51:25
【问题描述】:

我正在 Oracle 12c 中寻找一个查询,以将欧洲时区中的 18-12-2003 13:15:00 转换为 2003-12-18T13:15:00+01:00 作为日期时间数据类型。

这是可能的还是我错过了什么?

【问题讨论】:

  • ISO 8601 不是数据类型,而是日期显示格式。 date 数据类型没有任何格式(某个确切的日子是每个人的日子,它不依赖于任何文化)。要以某种格式显示,必须将日期转换为字符串(charvarchar2)。你想用这个字符串做什么?

标签: sql oracle oracle12c datetime-format iso8601


【解决方案1】:

首先您需要转换字符串(我假设您的输入数据是字符串,而不是正确的DATETIMESTAMP 值),然后您可以附加时区。

欧洲有好几个时区,你一定要具体一点。

FROM_TZ(TO_TIMESTAMP('18-12-2003 13:15:00', 'DD-MM-YYYY HH24:MI:SS'), 'Europe/...')

完成后,您可以以任意格式输出结果:

TO_CHAR(
   FROM_TZ(TO_TIMESTAMP('18-12-2003 13:15:00', 'DD-MM-YYYY HH24:MI:SS'), 'Europe/...'),
   'YYYY-MM-DD"T"HH24:MI:SSTZH:TZM'
)

【讨论】:

    【解决方案2】:

    如果您想将列中的所有日期转换为 CET 时区的格式,并且您确定偏移量始终为 1,那么您可以这样做:

    SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', '1:00'),'YYYY"-"MM"-"DD"T"HH24":"MI":"SSTZR') 
       FROM DUAL;
    

    但是,问题是如何处理夏令时。夏令时生效时偏移量会改变吗?那里有很多考虑因素 - 这个question(感谢@Wernfried Domscheit)有一个很好的概述。

    例如,如果您的数据在 UTC 时区,并且您想在 CET 中显示它,那么您可以像这样转换它:

    注意夏季有 2 小时偏移,冬季有 1 小时偏移。

    WITH dates (season,dt) AS
    (
      SELECT 'summer', TO_DATE('01-AUG-2021','DD-MON-YYYY') FROM DUAL UNION ALL
      SELECT 'winter', TO_DATE('01-JAN-2021','DD-MON-YYYY') FROM DUAL
    )
    SELECT dt,
           season,
           TO_CHAR(
             FROM_TZ( CAST( dt AS TIMESTAMP ), 'UTC' )
               AT TIME ZONE 'CET',
             'YYYY-MM-DD HH24:MI:SS TZH:TZM TZR'
           ) AS cet_timezone
    FROM   dates;
    
    01-AUG-2021 summer  2021-08-01 02:00:00 +02:00 CET
    01-JAN-2021 winter  2021-01-01 01:00:00 +01:00 CET
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 2022-10-15
      • 2012-10-06
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多