如何处理 Oracle 数据库中的夏令时

How to handle Day Light Saving in Oracle database

在其中一台 Oracle 数据库服务器中,当我启动 "Select dbtimezone from dual" 时它显示“+01:00”,这是否意味着在夏天时钟会提前一小时?。在另一台服务器上显示“+00:00”是否意味着数据库服务器设置为 GMT?但我在 oracle pl/sql 中使用 sysdate。客户说 Aix 服务器在夏令时,这是否意味着数据库服务器将在时钟更改后采用 AIX 服务器设置? 如何解决这个问题。

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

In one of the Oracle database server it is showing "+01:00" when I fire the "Select dbtimezone from dual" does that mean in summer the clock will shift one hour ahead ?

这意味着您的数据库时区是 +01:00,而 UTC 时区

来自文档,

DBTIMEZONE returns the value of the database time zone. The return type is a time zone offset (a character type in the format '[+|-]TZH:TZM') or a time zone region name, depending on how the user specified the database time zone value in the most recent CREATE DATABASE or ALTER DATABASE statement.

因此,数据库的 DBTIMEZONE 数据库服务器 OS.

继承了时区值

虽然 SESSIONTIMEZONE 可以在会话级别被 alter session 语句覆盖。

例如,

ALTER SESSION SET TIME_ZONE=<timezone>;

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


In another server it is showing "+00:00" does that mean the database server setting is GMT ?

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

例如,

SELECT DBTIMEZONE FROM DUAL;

DBTIME
------
+00:00

documentation 阅读更多内容。

答案是:视情况而定。

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

  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 位客户端)。

  1. 数据库时区:DBTIMEZONE

其实这在日常使用中并不是那么重要,它只与TIMESTAMP WITH LOCAL TIME ZONE数据类型列有关,并定义了存储格式。

不是SYSDATESYSTIMESTAMP的时区!!!

如果数据库包含 table 和 TIMESTAMP WITH LOCAL TIME ZONE 列并且该列包含数据,则您无法更改数据库的 DBTIMEZONE。否则可以使用 ALTER DATABASE SET TIME_ZONE='...'; 更改。关闭并重新启动数据库后,更改才会生效。

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

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

这个时区与

的结果相关
  • SYSDATE

  • SYSTIMESTAMP


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

因此,如果您的数据库服务器 OS 设置正确,那么您应该从下周开始获得夏令时(至少对于欧洲而言)

我使用以下命令解决了这个问题 “Select 来自 DUAL 的时区 'GMT' 的 Sytimestamp' 此命令将始终提供 GMT 日期和时间,而不考虑 OS 时间。