如何在Oracle SQL存储过程中将日期/时间从一个时区转换为另一个时区?数据库服务器设置为使用 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;
首先,您可以使用SYSTIMESTAMP
返回TIMESTAMP WITH TIME ZONE
(在我的情况下,服务器在美国/东部时区运行,比格林威治标准时间晚 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