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

问题描述 投票:0回答:2

我有一个要求,系统日期显示如下 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。

如果我错了请纠正我..

sql oracle
2个回答
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;

0
投票

Oracle 不提供任何类似“AT SUMMER TIME”的时间戳功能。

您可以使用固定时区,例如

CET
+01:00
+02:00
,或者使用时区区域,例如
Europe/Amsterdam

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

说“像夏令时一样显示 1 月 1 日”有点棘手

例如,无论您在夏季还是冬季运行此查询,

SELECT TZ_OFFSET('Europe/Amsterdam') FROM dual;
都将始终返回
+01:00

© www.soinside.com 2019 - 2024. All rights reserved.