如何在Oracle数据库中处理Day Light Saving

san*_*dit 3 oracle utc oracle11g gmt dst

在其中一个Oracle数据库服务器中,当我触发"从双重选择dbtimezone"时它显示"+01:00"这是否意味着在夏天时钟将提前一小时?在另一台服务器上显示"+00:00"是否意味着数据库服务器设置为GMT?但我在oracle pl/sql中使用sysdate.客户端说Aix服务器在DST上,那么这意味着数据库服务器将在时钟更改后采用AIX服务器设置吗?如何解决这个问题.

Wer*_*eit 9

答案是:这取决于.

总的来说,您的数据库有三个时区

  1. 您的视野时区: SESSIONTIMEZONE

    您可以随时更改ALTER SESSION SET TIME_ZONE=....它与结果有关

    • CURRENT_DATE
    • LOCALTIMESTAMP
    • CURRENT_TIMESTAMP


    这也是你的目标时区 CAST({TIMESTAMP/DATE without any timezone} AS TIMESTAMP WITH {LOCAL} TIME ZONE)

    默认值SESSIONTIMEZONE可以通过环境变量ORA_SDTZ或(在Windows上)通过注册表项HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\ORA_SDTZ(对于32位客户端)来设置.HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\ORA_SDTZ(对于64位客户端).

  2. 数据库时区: DBTIMEZONE

    实际上这在日常使用中并不那么重要,它仅与 TIMESTAMP WITH LOCAL TIME ZONE数据类型列相关并定义存储格式.

    不是时区SYSDATESYSTIMESTAMP!!!

    DBTIMEZONE如果数据库包含带有TIMESTAMP WITH LOCAL TIME ZONE列的表并且该列包含数据,则无法更改数据库.否则可以改变ALTER DATABASE SET TIME_ZONE='...';.在关闭并重新启动数据库之前,更改不会生效.

    DBTIMEZONE在创建数据库时设置.如果在创建数据库时未提供时区,则Oracle默认为服务器操作系统的时区.

  3. 数据库服务器操作系统的时区:

    此时区与结果相关

    • SYSDATE
    • SYSTIMESTAMP


    当然,这个时区不能在数据库级别上更改.如果您所在的国家/地区使用夏令时,则此时区可能会每年更改两次.例如,您可以查询它SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual;.

因此,如果您的数据库服务器操作系统设置正确,那么您应该从下周开始夏令时(至少在欧洲)


san*_*dit 2

我通过使用以下命令解决了此问题:“从 DUAL 中选择时区‘GMT’的 Systimestamp”。无论操作系统时间如何,此命令将始终给出 GMT 日期和时间。

  • 如果这就是您所追求的,您可以只使用“SYS_EXTRACT_UTC(SYSTIMESTAMP)”作为[已在此处回答](http://stackoverflow.com/questions/1157873/how-to-get-utc-value-for-sysdate-on - 甲骨文)。 (2认同)