借助oracle中的UTC包函数将sysdate转换为CET和CEST时间

时间:2015-01-19 12:54:20

标签: sql oracle

我有一个要求,其中sysdate显示为19/01/2015 13:22:05

我希望将sysdate转换为CET时间19/01/2015 14:22:05

我想再次将sysdate转换为CEST,它将是19/01/2015 15:22:05

select to_char(sysdate , 'DD/MM/YYYY HH24:MI:SS') actual ,
to_char(utc.get_local_date(sysdate ,'LOCATION') ,'DD/MM/YYYY HH24:MI:SS') cet,
to_char(utc.get_local_date(sysdate ,'LOCATION')+1/24 ,'DD/MM/YYYY HH24:MI:SS')  cest
FROM dual 

此处的位置正在使用Europe/Amsterdam时区。

请建议我们无论如何都可以在sql中使用+/24包硬编码+/24来实现CET和CEST时序。

如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:0)

我从未听过utc.get_local_date的任何内容,也许你把它与MySQL混合在一起。

在Oracle上你可以这样做:

SELECT 
    TO_CHAR(SYSTIMESTAMP , 'DD/MM/YYYY HH24:MI:SS') actual,
    TO_CHAR(SYSTIMESTAMP AT TIME ZONE 'CET', 'DD/MM/YYYY HH24:MI:SS') AS cet,
    TO_CHAR(SYSTIMESTAMP AT TIME ZONE 'CET' + INTERVAL '1' HOUR, 'DD/MM/YYYY HH24:MI:SS') AS cest
FROM dual;

问题是CET未涵盖任何夏令时。为了自动覆盖DST,您必须使用长时区名称,例如

SELECT 
    TO_CHAR(SYSTIMESTAMP AT TIME ZONE 'Europe/Berlin', 'DD/MM/YYYY HH24:MI:SS') AS cet
FROM dual;

答案 1 :(得分:0)

Oracle没有为时间戳提供“AT SUMMER TIME”之类的任何功能。

您可以使用固定时区,例如CET+01:00+02:00,也可以使用时区区域,例如Europe/Amsterdam

使用时区区域时,会自动处理夏令时设置,即输出取决于输入日。

说“1月1日显示为夏令时”有点棘手

例如SELECT TZ_OFFSET('Europe/Amsterdam') FROM dual;将始终返回+01:00,无论您是在夏季还是冬季运行此查询。