Oracle SQL:将UTC转换为CST

时间:2014-10-29 17:15:37

标签: sql oracle function date converter

我想将UTC日期/时间转换为本地CST。

以下功能有效,但只有5个小时(直到2014年2月2日的日间照明),它会产生6小时的差异。

CAST((FROM_TZ(CAST(utc_date AS TIMESTAMP),'UTC') AT TIME ZONE 'CST') AS DATE) cst_date

也试过了一个变种

to_date(to_char((from_tz(to_timestamp(to_char(utc_date, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') ,'UTC')
at time zone 'CST'),'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') as cst_date,

3 个答案:

答案 0 :(得分:1)

使用" US / Central"因为目标时区似乎产生了正确的结果。

select from_tz(CAST ('15-oct-2014' AS TIMESTAMP),'GMT') at  TIME ZONE 'US/Central' with_daylight_savings,
       from_tz(CAST ('15-nov-2014' AS TIMESTAMP),'GMT') at  TIME ZONE 'US/Central' without_daylight_savings
from dual;


WITH_DAYLIGHT_SAVINGS                       WITHOUT_DAYLIGHT_SAVINGS
--------------------------------------------------------------------------------------
14-OCT-14 07.00.00.000000000 PM US/CENTRAL  14-NOV-14 06.00.00.000000000 PM US/CENTRAL

答案 1 :(得分:0)

使用时区而不是时区abbr('CST')。您可以在此处找到所需的时区:

SELECT * from v$timezone_names where tzabbrev = 'CST';

也许你需要'CST6CDT'代替'CST'

答案 2 :(得分:0)

也许是一种愚蠢的方法,但你从这个查询得到了什么?

SELECT 
   TO_CHAR((TIMESTAMP '2014-01-01 00:00:00' + LEVEL * INTERVAL '1' DAY) AT TIME ZONE 'America/Chicago', 'yyyy-mm-dd hh24:mi TZH:TZM') AS dst,
   TO_CHAR((FROM_TZ(CAST(DATE '2014-01-01' AS TIMESTAMP), 'UTC') + LEVEL * INTERVAL '1' DAY) AT TIME ZONE 'America/Chicago', 'yyyy-mm-dd hh24:mi TZH:TZM') AS dst
FROM dual
CONNECT BY LEVEL <= 365;

是否符合预期?