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

时间:2015-03-26 04:40:05

标签: oracle oracle11g utc dst gmt

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

4 个答案:

答案 0 :(得分:7)

答案是:这取决于。

您的数据库总共有三个时区

  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;来查询它。

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

答案 1 :(得分:4)

  

在其中一个Oracle数据库服务器中,当我触发“从双重选择dbtimezone”时它显示“+01:00”这是否意味着在夏天时钟会提前一小时移动?

这意味着您的数据库时区为+01:00 UTC时区相比。

来自docs,

  

DBTIMEZONE返回数据库时区的值。回报   type是时区偏移量(格式中的字符类型)   '[+ | - ] TZH:TZM')或时区区域名称,具体取决于用户的方式   在最近的CREATE中指定数据库时区值   DATABASE或ALTER DATABASE语句。

因此,数据库DBTIMEZONE继承了数据库服务器操作系统的时区值。

虽然会话级别可以通过alter session语句覆盖SESSIONTIMEZONE

例如,

ALTER SESSION SET TIME_ZONE=<timezone>;

这会修改 TIMESTAMP WITH LOCAL TIME ZONE 的时区。


  

在另一台服务器上显示“+00:00”是否意味着数据库服务器设置为GMT?

+00:00可以假设数据库时区设置为 UTC时区

例如,

SELECT DBTIMEZONE FROM DUAL;

DBTIME
------
+00:00

documentation了解详情。

答案 2 :(得分:2)

我使用以下命令解决了这个问题 “从DUAL'在时区'GMT'选择Systimestamp'此命令将始终给出GMT日期和时间,而不考虑操作系统时间。

答案 3 :(得分:0)

Oracle数据库自动确定夏令时是否对指定时区有效并返回相应的本地时间。通常,日期/时间值足以允许Oracle数据库确定夏令时是否对指定时区有效。夏令时开始或结束的时段是边界情况。例如,在美国东部地区,当夏令时生效时,时间从凌晨01:59:59变为凌晨3:00:00。 02:00:00和02:59:59之间的时间间隔不存在。该间隔中的值无效。当夏令时结束时,时间从凌晨02:00:00到凌晨01:00:01变化。 可在此处找到进一步的解释。 http://docs.oracle.com/cd/E18283_01/server.112/e10729/ch4datetime.htm#insertedID11