我有一个要求,系统日期显示如下 19/01/2015 13:22:05
我想将系统日期转换为 CET 时间,即
19/01/2015 14:22:05
我想将系统日期转换为 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
时区。
请建议我们是否可以通过使用 UTC 包函数来实现 CET 和 CEST 计时,而无需在 SQL 中硬编码 +1/24。
如果我错了请纠正我..
我从来没有听到过任何来自
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;
Oracle 不提供任何类似“AT SUMMER TIME”的时间戳功能。
您可以使用固定时区,例如
CET
或 +01:00
或 +02:00
,或者使用时区区域,例如Europe/Amsterdam
。
当您使用时区区域时,夏令时设置会自动处理,即输出取决于输入日期。
说“像夏令时一样显示 1 月 1 日”有点棘手
例如,无论您在夏季还是冬季运行此查询,
SELECT TZ_OFFSET('Europe/Amsterdam') FROM dual;
都将始终返回+01:00
。