Oracle 10g时区混乱

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个

  • 会话/客户端的时区
    • 在SESSIONTIMEZONE中显示
    • 这是CURRENT_DATE,LOCALTIMESTAMP和CURRENT_TIMESTAMP的时区.这三者之间的区别是返回类型,它们分别返回DATE,TIMESTAMP和TIMESTAMP WITH TIME ZONE)
  • 数据库时区
    • 显示在DBTIMEZONE中
    • 这是用于TIMESTAMP WITH LOCAL TIME ZONE值的内部存储的时区.请注意,值在插入/选择时转换为/从会话时区转换,因此它实际上并不像看起来那么重要
    • 这不是SYSDATE/SYSTIMESTAMP的时区
  • 数据库操作系统时区
    • 在unix中,它基于Oracle启动时的TZ变量
    • 这是SYSDATE和SYSTIMESTAMP的时区

在您的第一个示例中,我可以看到会话TZ是UTC-6,数据库TZ是UTC,数据库OS时区是UTC-6.

在第二个示例中,我可以看到会话TZ是UTC-6,数据库TZ是UTC + 2,数据库OS时区是UTC + 1.


YoY*_*oYo 5

详细信息在文档的细则中。查看返回类型,以及计算 DATE 或 TIMESTAMP 的实际时区。

  1. 系统日期
    • 返回类型:日期
    • 时区:数据库服务器的主机操作系统
  2. 当前的日期
    • 返回类型:日期
    • 时区:会话
  3. 系统时间戳
    • 返回类型:TIMESTAMP WITH TIME ZONE
    • 时区:数据库服务器的主机操作系统
  4. CURRENT_SYSTIMESTAMP
    • 返回类型:TIMESTAMP WITH TIME ZONE
    • 时区:会话
  5. 本地时间戳
    • 返回类型:时间戳
    • 时区:会话
  6. 数据库时区
    • 时区:数据库时区。继承自 DB Server OS,但可以使用 set at DB Creation 或 Alter using TIME_ZONE DB Parameter (SET TIME_ZONE=...) 来覆盖。这会影响用于 TIMESTAMP WITH LOCAL TIME ZONE 数据类型的时区。
  7. 会话时区
    • 时区:会话时区。继承自会话托管操作系统,但可以使用 ALTER SESSION (ALTER SESSION SET TIME_ZONE=...) 覆盖。

返回类型,指示时区在数据类型中是否可用。如果您尝试在数据类型不带 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)

更多信息请见我的博客


Emm*_*l N 3

使用UTC时间并从 UTC 偏移您的时区,要在 Oracle 中获取 UTC,请使用SYS_EXTRACT_UTC

将 SYSTEMDATE 转换为 UTC

    select sys_extract_utc(systimestamp) from dual;
Run Code Online (Sandbox Code Playgroud)

至于差异,Oracle 文档中的定义可能有助于解释:

  • LOCALTIMESTAMP以数据类型 TIMESTAMP 的值返回会话时区中的当前日期和时间
  • CURRENT_TIMESTAMP返回会话时区中的当前日期和时间,采用数据类型 TIMESTAMP WITH TIME ZONE 的值
  • SYSTIMESTAMP返回数据库所在系统的系统日期,包括秒数和时区
  • CURRENT_DATE返回会话时区中的当前日期,采用数据类型 DATE 的公历值。
  • SYSDATE返回为数据库所在的操作系统设置的当前日期和时间。
  • DBTIMEZONE返回数据库时区的值。