使用TIMEZONE查询Oracle TIMESTAMP

Ste*_*bbi 5 sql oracle timezone oracle11g

我在Oracle DB表中有一个类型的列TIMESTAMP(6) WITH TIME ZONE.有数据行包含来自不同时区的数据,一些是UTC,一些是其他时区偏移.

有没有办法可以查询Oracle表,以便结果总是以UTC的形式返回,并进行适当的时移?有没有什么可以在查询本身上完成,或者可能以某种方式改变会话?我已经尝试将会话时区更改为Utc,但这似乎只会影响CURRENT_TIMESTAMP值.

ALTER SESSION SET TIME_ZONE = 'Utc'
Run Code Online (Sandbox Code Playgroud)

例如,如果值存储为:

21-JAN-10 03.28.38.635000000 PM -05:00
Run Code Online (Sandbox Code Playgroud)

查询将返回为

21-JAN-10 08.28.38.635000000 PM Utc
Run Code Online (Sandbox Code Playgroud)

示例表定义

CREATE TABLE "MyDb"."Books"
  (
    "GUID" RAW(32) DEFAULT SYS_GUID(),
     "DATE_CREATED" TIMESTAMP (6) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
);
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 12

您应该能够使用AT TIME ZONE语法

SELECT column_name at time zone 'UTC'
  FROM your_table
Run Code Online (Sandbox Code Playgroud)

SQL> select * from foo;

COL1
---------------------------------------------------------------------------
09-FEB-12 01.48.40.072000 PM -05:00
09-FEB-12 10.49.26.613000 AM US/PACIFIC

SQL> select col1 at time zone 'UTC'
  2    from foo;

COL1ATTIMEZONE'UTC'
---------------------------------------------------------------------------
09-FEB-12 06.48.40.072000 PM UTC
09-FEB-12 06.49.26.613000 PM UTC
Run Code Online (Sandbox Code Playgroud)

  • @StealthRabbi - 如果该列是"TIMESTAMP WITH LOCAL TIME ZONE",则该值将隐式转换为会话的时区,该时区可以设置为UTC.除非您使用"AT TIME ZONE"语法进行转换,否则"TIMESTAMP WITH TIME ZONE"将显示在插入的任何时区. (2认同)