如何使用From_Tz with Offset进行时间转换Oracle

时间:2015-01-21 13:40:29

标签: oracle

如何使用From_tz将当前时区转换为EST,使用偏移量转换为IST。此转换是否包括日间节能效果?

1 个答案:

答案 0 :(得分:0)

如果您当前的时区为EST,您可以执行以下操作:

SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', 'Asia/Calcutta') FROM dual;

否则,您首先必须转换为UTCEST,即

SELECT 
    FROM_TZ(CAST(TIMESTAMP '2000-03-28 08:00:00' AT TIME ZONE 'EST' AS TIMESTAMP), 'Asia/Calcutta'), 
    FROM_TZ(SYS_EXTRACT_UTC(TIMESTAMP '2000-03-28 08:00:00'), 'Asia/Calcutta') 
FROM dual;

注意,IST不是Oracle中的有效时区名称,请参阅您自己的问题:How to convert time zones in oracle?

您可以使用功能SESSIONTIMEZONE

检查当前的会话时区

如果您想要加入它们,则必须使用完整的地区名称,例如: America/New_YorkAsia/Calcutta。像+05:00这样的时区偏移不包含任何夏令时效果。对于简称,它有所不同,例如EST不使用DST,CET不会。

为了获得“实时”偏移,您必须使用EXTRACT函数:

SELECT 
    EXTRACT(TIMEZONE_HOUR FROM FROM_TZ(TIMESTAMP '2015-01-01 00:00:00', 'Europe/Berlin')) offset_winter, 
    EXTRACT(TIMEZONE_OFFSET FROM FROM_TZ(TIMESTAMP '2015-01-01 00:00:00', 'Europe/Berlin')) offset_winter, 
    EXTRACT(TIMEZONE_HOUR FROM FROM_TZ(TIMESTAMP '2015-07-01 00:00:00', 'Europe/Berlin')) offset_summer,
    EXTRACT(TIMEZONE_OFFSET FROM FROM_TZ(TIMESTAMP '2015-07-01 00:00:00', 'Europe/Berlin')) offset_summer
FROM dual;

OFFSET_WINTER   OFFSET_WINTER_1       OFFSET_SUMMER   OFFSET_SUMMER_1
1               +00 01:00:00.000000   2               +00 02:00:00.000000