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

标签 sql oracle timezone

如何在 Oracle SQL 存储过程中将日期/时间戳从一个时区转换为另一个时区? DB 服务器设置为使用 GMT,连接到 DB 的机器也是如此,但是数据必须保存在 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 小时在 GMT 之后),因此您不必使用 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

关于sql - 如何在oracle sql存储过程中转换时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13806130/

相关文章:

mysql - 如何将带有 current_timestamp 的本地时区详细信息作为 mysql 中列的默认值

mysql - 连接具有不同列名和相同行的两个表

php - 如何查看MySQL查询错误详情?

oracle - Oracle 中的 empty_clob 和 createtemporary 有什么区别?

sql - 触发器从另一个表中删除行

java - 将 EDT 时区转换为 GMT 在 Java 中无法正常工作

php.ini 默认时区与 date.timezone

sql - 添加新列到现有表中

php - 如何在数据库中查询特定日期范围

oracle - SSRS - Oracle DB,传递日期参数