Har*_*rry 3 sql oracle timezone oracle11g
我正在尝试TIMESTAMP WITH TIMEZONE从UTC-5(NY)的数据库中读取Oracle 作为UTC.
甲骨文让我抓狂:
SELECT
from_tz(MAX(TIMESTAMPWITHTIMEZONE),'UTC'),
SYS_EXTRACT_UTC(MAX(TIMESTAMPWITHTIMEZONE)),
SYS_EXTRACT_UTC(systimestamp),
SYSTIMESTAMP AT TIME ZONE 'UTC'
FROM TABLE
Run Code Online (Sandbox Code Playgroud)
结果:
SYS_EXTRACT_UTC(systimestamp)给了我:2013-02-20 14:59:04,这可能是正确的.
SYSTIMESTAMP AT TIME ZONE 'UTC'给了我:2013-02-20 15:59:04这是我自己的当地柏林 - 无论如何
SYS_EXTRACT_UTC(MAX(TIMESTAMPWITHTIMEZONE)) 是 2013-02-20 08:55:01
from_tz(MAX(TIMESTAMPWITHTIMEZONE),'UTC') 是 2013-02-20 10:55:01
Srly.甲骨文.我想要UTC.
哪一个是正确的?或者,还有更好的方法?
功能不同:
SYS_EXTRACT_UTC将a转换TIMESTAMP WITH TIMEZONE为a TIMESTAMP(具有推断但不存在的时区= UTC).FROM_TZ将a转换TIMESTAMP为aTIMESTAMP WITH TIMEZONE应用于单个值时,这些函数通常会返回不同的结果:
SQL> SELECT sys_extract_utc(localtimestamp) ext,
2 from_tz(localtimestamp, 'UTC') from_tz
3 FROM dual;
EXT FROM_TZ
--------------------- ------------------------
2013/02/20 15:34:24 2013/02/20 16:34:24 UTC
Run Code Online (Sandbox Code Playgroud)
在第一种情况中TIMESTAMP被隐式地给出的服务器的时区,然后转化进在UTC时区的等效时间戳.请注意,通常您应远离隐式转换.
在第二种情况下,时区之间没有计算:该FROM_TZ函数将地理位置添加到时间点变量.
顺便说一句,您的示例中缺少某些内容:您无法FROM_TZ在类型变量上应用该函数TIMESTAMP WITH TIMEZONE(在9ir2和11ir2上测试):
SQL> select from_tz(systimestamp, 'UTC') from dual;
select from_tz(systimestamp, 'UTC') from dual
ORA-00932: inconsistent datatypes:
expected TIMESTAMP got TIMESTAMP WITH TIME ZONE
Run Code Online (Sandbox Code Playgroud)
编辑以下评论:
在您的情况下,假设您的列是时间TIMESTAMP,并且知道它们引用了NY时区,您可以使用AT TIME ZONE表达式转换为UTC:
SQL> SELECT localtimestamp,
2 from_tz(localtimestamp, 'America/New_York') AT TIME ZONE 'UTC' utc
3 FROM dual;
LOCALTIMESTAMP UTC
--------------------- ------------------------
2013/02/20 17:09:09 2013/02/20 22:09:09 UTC
Run Code Online (Sandbox Code Playgroud)