Cad*_*oux 5 oracle timezone oracle10g
SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI')
,TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD HH24:MI')
,TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR')
,TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD HH24:MI TZR')
,TO_CHAR(LOCALTIMESTAMP, 'YYYY-MM-DD HH24:MI TZR')
,DBTIMEZONE
,SESSIONTIMEZONE
FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
回来了:
2012-01-16 11:42
2012-01-16 11:42
2012-01-16 11:42 -06:00
2012-01-16 11:42 -06:00
2012-01-16 11:42 +00:00
+00:00
-06:00
Run Code Online (Sandbox Code Playgroud)
似乎认为数据库时区是GMT,但SYSDATE与CURRENT_DATE相同.
当我远程进入该服务器(Windows)时,时区显然是CST(但是,我知道这可能是我的终端服务客户端时区偏移,但是这台机器上没有终端服务,只是管理)
对阿姆斯特丹的服务器运行相同的事情(4分钟后,所有来自同一个TOAD客户端),我得到:
2012-01-16 18:46
2012-01-16 11:46
2012-01-16 18:46 +01:00
2012-01-16 11:46 -06:00
2012-01-16 11:46 +00:00
+02:00
-06:00
Run Code Online (Sandbox Code Playgroud)
注意+2,但至少SYSDATE和CURRENT_DATE是不同的.
这里发生了什么?SYSDATE来自哪里,还有其他影响它的东西吗?
似乎DBTIMEZONE不用于任何这些东西?那么DBTIMEZONE用于什么?
Chi*_*Chi 11
这里实际上有3个时区,而不是2个
在您的第一个示例中,我可以看到会话TZ是UTC-6,数据库TZ是UTC,数据库OS时区是UTC-6.
在第二个示例中,我可以看到会话TZ是UTC-6,数据库TZ是UTC + 2,数据库OS时区是UTC + 1.
详细信息在文档的细则中。查看返回类型,以及计算 DATE 或 TIMESTAMP 的实际时区。
返回类型,指示时区在数据类型中是否可用。如果您尝试在数据类型不带 TimeZone 的情况下打印 TZR,那么它只会显示为 +00:00(并不意味着它是 GMT)。否则,它将显示与数据库或会话匹配的时区,如所示。
时区,表示时间是在哪个时区计算的。对于匹配时区,将显示相同的日期/时间 (HH24:MI)。
请注意,在使用 DB TIME_ZONE 设置的时区(或由 DBTIMEZONE 函数返回)中,没有任何 FUNCTIONS 返回 TIME。也就是说,没有任何函数也返回 TIMESTAMP WITH LOCAL TIME ZONE 的数据类型。但是,您可以将任何返回时区的函数的输出转换为不同的时区(包括 DBTIMEZONE),如下所示:
SELECT SYSTIMESTAMP AT TIME ZONE DBTIMEZONE FROM DUAL;
Run Code Online (Sandbox Code Playgroud)
更多信息请见我的博客。
使用UTC时间并从 UTC 偏移您的时区,要在 Oracle 中获取 UTC,请使用SYS_EXTRACT_UTC
将 SYSTEMDATE 转换为 UTC
select sys_extract_utc(systimestamp) from dual;
Run Code Online (Sandbox Code Playgroud)
至于差异,Oracle 文档中的定义可能有助于解释: