将UTC时间转换为oracle中的特定时区

时间:2017-10-05 10:15:40

标签: oracle

我必须将UTC时间转换为某个特定时区,我已将sysdate转换为UTC,现在我想将其转换为特定时区,这就是我将sysdate转换为UTC的方式

select cast(sys_extract_utc(systimestamp) as DATE) from dual;

我尝试在关键字之前写+5,但是在5天后返回日期。

select cast(sys_extract_utc(systimestamp) as DATE)+5 from dual;

我已经通过以下查询得到了时区偏移量,但我有线索在上面的查询中使用它

SELECT TZ_OFFSET('US/Eastern') FROM DUAL;

如何将UTC时间转换为某个时区偏移量,如下所示

select cast(sys_extract_utc(systimestamp) as DATE) from dual where TZ_OFFSET=+5;

2 个答案:

答案 0 :(得分:2)

您可以使用以下方式获取当前的UTC时间:

SELECT CAST( SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE )
FROM   DUAL;

您可以使用以下方式撤消在DATETIMESTAMP WITH TIME ZONE更改为+04:00的过程:

SELECT FROM_TZ( CAST( your_date AS TIMESTAMP ), 'UTC' ) AT TIME ZONE '+04:00'
FROM   your_table

答案 1 :(得分:1)

尝试添加时区偏移会给您带来夏令时调整的问题。

您可以使用the at time zone syntax指定转化,但不需要先转换为UTC。如果你这样做,你可能无法得到你所期望的,而无需采取额外措施:

select systimestamp as sys_ts,
  sys_extract_utc(systimestamp) as utc_ts,
  sys_extract_utc(systimestamp) at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         UTC_TS                  EDT_TS                            
------------------------------ ----------------------- ----------------------------------
2017-10-05 11:30:41.023 +01:00 2017-10-05 10:30:41.023 2017-10-05 05:30:41.023 US/EASTERN

据说纽约的时间是05:30,当时写作时间是06:30。

sys_extract_utc函数为您提供系统时间的UTC等效值,但是使用嵌入的时区信息 - 它是一个简单的时间戳,而不是带时区的时间戳。因此,当您调整它时,它会隐式转换为系统时区而不进行调整,从而使您的实际时间错误。

您可以使用the from_tz() function指定提取的值为UTC:

select systimestamp as sys_ts,
  sys_extract_utc(systimestamp) as utc_ts,
  from_tz(sys_extract_utc(systimestamp), 'UTC') at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         UTC_TS                  EDT_TS                            
------------------------------ ----------------------- ----------------------------------
2017-10-05 11:30:41.144 +01:00 2017-10-05 10:30:41.144 2017-10-05 06:30:41.144 US/EASTERN

但是您不需要做那么多工作,您可以采用原始时区感知systimestamp值并直接应用at time zone

select systimestamp as sys_ts,
  systimestamp at time zone 'US/Eastern' as edt_ts
from dual;

SYS_TS                         EDT_TS                            
------------------------------ ----------------------------------
2017-10-05 11:30:41.271 +01:00 2017-10-05 06:30:41.271 US/EASTERN

如果需要,您可以将其转换为日期数据类型:

cast(from_tz(sys_extract_utc(systimestamp), 'UTC') at time zone 'US/Eastern' as date)

或更简单:

cast(systimestamp at time zone 'US/Eastern' as date)