我必须将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;
答案 0 :(得分:2)
您可以使用以下方式获取当前的UTC时间:
SELECT CAST( SYSTIMESTAMP AT TIME ZONE 'UTC' AS DATE )
FROM DUAL;
您可以使用以下方式撤消在DATE
将TIMESTAMP 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)