【问题标题】:Oracle Convert TIMESTAMP with Timezone to DATEOracle 将带有时区的 TIMESTAMP 转换为 DATE
【发布时间】:2013-12-04 02:04:49
【问题描述】:

我有时区为+04:00 (Europe/Moscow) 的数据库,需要在Oracle 11g 中将YYYY-MM-DD"T"HH24:MI:SSTZH:TZM 格式的字符串转换为DATE 数据类型。

换句话说,我有一个字符串2013-11-08T10:11:31+02:00,我想将其转换为DATE 数据类型(在本地数据库时区+04:00 (Europe/Moscow))。

对于字符串2013-11-08T10:11:31+02:00,我所需的转换应返回DATE 数据类型,日期为2013-11-08 12:11:31(即本地时区时间转换为+04:00 (Europe/Moscow))。字符串的时区可能不同,上面字符串中的+02:00 只是示例。

我尝试使用 TIMESTAMP 数据类型执行此操作,但时区转换没有成功。

【问题讨论】:

  • 除了需要“本地”时间的情况(即调度/计划,尤其是夏令时的时区),通常最好存储以 UTC 格式存储的绝对时间戳(并在显示/报告中进行转换) .这些时间戳的用途是什么?
  • 我从外部系统收到这种时间戳格式的日期,但不知道为什么外部系统使用它们。 :(
  • 找到了我的答案.. 但如果你想仔细检查时间戳是真还是假,我找到了一个很好的网站。 onlinetimestampconvert.com

标签: sql oracle date timestamp


【解决方案1】:

您可以使用 CAST(x AT TIME ZONE 'YYYY' AS DATE) 管理时区,这对我有帮助:

WITH t1 (tm) AS (SELECT TIMESTAMP '2021-12-14 15:33:00 EET' FROM DUAL)

SELECT 'EET' tz, CAST (tm AT TIME ZONE 'Europe/Kaliningrad' AS DATE) AS datetime FROM t1
union SELECT 'MSK' tz, CAST (tm AT TIME ZONE 'Europe/Moscow' AS DATE) AS datetime FROM t1
union SELECT 'CET' tz, CAST (tm AT TIME ZONE 'Europe/Prague' AS DATE) AS datetime FROM t1
union SELECT 'UTC' tz, CAST (tm AT TIME ZONE 'UTC' AS DATE) AS datetime FROM t1

【讨论】:

  • 欢迎来到 Stack Overflow。当代码附有解释时,它会更有帮助。 Stack Overflow 是关于学习的,而不是提供 sn-ps 来盲目复制和粘贴。请编辑您的问题并解释它如何回答所提出的具体问题。见【如何回答】stackoverflow.com/questions/how-to-answer)
【解决方案2】:

将时间戳转换为日期:

cast(registrationmaster.Stamp5DateTime 作为日期) >= '05-05-2018' AND cast(registrationmaster.Stamp5DateTime 作为日期)

【讨论】:

    【解决方案3】:

    如果您希望您的时区时间戳转换为与“sysdate”同步的日期,请使用以下命令:

    select CAST(to_timestamp_tz('2013-11-08T10:11:31-02:00',
    'yyyy-mm-dd"T"hh24:mi:sstzh:tzm') at time zone to_char(systimestamp,
    'tzh:tzm') AS DATE)
    from dual
    

    【讨论】:

    • 我无法告诉你我搜索了多长时间!
    【解决方案4】:
    SELECT
    CAST((FROM_TZ(CAST(timezonefield AS TIMESTAMP),'GMT') AT TIME ZONE 'CET') AS DATE) 
    FROM table;
    

    将格林威治标准时间的时间戳转换为中欧时间的日期

    【讨论】:

      【解决方案5】:

      带有at time zone 子句的to_timestamp_tz() 函数可用于将字符串文字转换为timestamp with time zone 数据类型的值:

      SQL> with t1(tm) as(
        2    select '2013-11-08T10:11:31+02:00' from dual
        3  )
        4  select to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')
        5           at time zone '+4:00'         as this_way
        6       , to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM')
        7           at time zone 'Europe/Moscow' as or_this_way
        8    from t1
        9  /
      

      结果:

      THIS_WAY                            OR_THIS_WAY
      ----------------------------------------------------------------------------
      2013-11-08 12.11.31 PM +04:00       2013-11-08 12.11.31 PM EUROPE/MOSCOW
      

      然后,我们使用cast() 函数生成date 数据类型的值:

      with t1(tm) as(
        select '2013-11-08T10:11:31+02:00' from dual
      )
      select cast(to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') 
               at time zone '+4:00' as date)   as this_way  
           , cast(to_timestamp_tz(tm, 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') 
               at time zone 'Europe/Moscow' as date) as or_this_way
        from t1
      
      This_Way             Or_This_Way 
      ------------------------------------------
      2013-11-08 12:11:31  2013-11-08 12:11:31 
      

      详细了解at time zone 子句和to_timestamp_tz() 函数。

      【讨论】:

      • 谢谢! select CAST(to_timestamp_tz('2013-11-08T10:11:31+02:00', 'yyyy-mm-dd"T"hh24:mi:ss TZH:TZM') at time zone DBTIMEZONE AS DATE) from dual 对我来说是正确的方式
      猜你喜欢
      • 2010-12-12
      • 2013-10-09
      • 2013-08-08
      • 2021-08-30
      • 2021-07-22
      • 2015-06-27
      • 2011-11-28
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多