如何在oracle sql存储过程中转换时区?

时间:2012-12-10 17:36:29

标签: sql oracle timezone

如何在Oracle SQL存储过程中将date / timeztamp从一个时区转换为另一个时区?数据库服务器设置为使用GMT,连接到数据库的机器也是如此,但数据必须保存在CST或CDT中,具体取决于是否为夏令时。

我有这个SQL工作:

select to_char(from_tz(TO_TIMESTAMP(to_char(SYSDATE,'mm-dd-yyyy hh24:mi:ss'), 'mm-dd-yyyy hh24:mi:ss'),'GMT')  at time zone 'CST6CDT','mm-dd-yyyy hh24:mi:ss') from dual;

但是当我把它放入一个程序时,它会因为这个错误而失败:ORA-01843:不是一个有效的月份

这就是我对程序的要求:

declare 
p_systemDT TIMESTAMP WITH TIME ZONE;
BEGIN
select to_char(from_tz(TO_TIMESTAMP(to_char(SYSDATE,'mm-dd-yyyy hh24:mi:ss'), 'mm-dd-yyyy hh24:mi:ss'),'GMT')  at time zone 'CST6CDT','mm-dd-yyyy hh24:mi:ss')  into p_systemDT  from dual;
DBMS_OUTPUT.PUT_LINE('p_systemDT = ' || p_systemDT);
end;

1 个答案:

答案 0 :(得分:1)

首先,您可以使用SYSTIMESTAMP返回TIMESTAMP WITH TIME ZONE(在我的情况下,服务器在美国/东部时区运行,比GMT晚5个小时),因此您没有取SYSDATE并将其转换为时间戳

SQL> select systimestamp
  2    from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
10-DEC-12 12.39.51.755000 PM -05:00

然后,您可以将SYSTIMESTAMP转换为您想要的任何时区(在这种情况下为'CST6CDT')

SQL> ed
Wrote file afiedt.buf

  1  select systimestamp at time zone 'CST6CDT'
  2*   from dual
SQL> /

SYSTIMESTAMPATTIMEZONE'CST6CDT'
---------------------------------------------------------------------------
10-DEC-12 11.40.14.491000 AM CST6CDT

然后,如果要指定字符串的格式,可以添加to_char

SQL> ed
Wrote file afiedt.buf

  1  select to_char( systimestamp at time zone 'CST6CDT', 'mm-dd-yyyy hh24:mi:ss' )
  2*   from dual
SQL> /

TO_CHAR(SYSTIMESTAM
-------------------
12-10-2012 11:40:48
相关问题