如何处理 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 阅读更多内容。
答案是:视情况而定。
您的数据库总共有 三个 个时区
- 您的会话时区:
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 位客户端)。
- 数据库时区:
DBTIMEZONE
其实这在日常使用中并不是那么重要,它只与TIMESTAMP WITH LOCAL TIME ZONE
数据类型列有关,并定义了存储格式。
这不是SYSDATE
或SYSTIMESTAMP
的时区!!!
如果数据库包含 table 和 TIMESTAMP WITH LOCAL TIME ZONE
列并且该列包含数据,则您无法更改数据库的 DBTIMEZONE
。否则可以使用 ALTER DATABASE SET TIME_ZONE='...';
更改。关闭并重新启动数据库后,更改才会生效。
DBTIMEZONE
在创建数据库时设置。如果在创建数据库时未提供时区,则 Oracle 默认使用服务器操作系统的时区。
- 数据库服务器操作系统的时区:
这个时区与
的结果相关
SYSDATE
SYSTIMESTAMP
自然不能在数据库级别更改此时区。如果您所在的国家/地区使用夏令时,则该时区可能每年更改两次。例如,您可以使用 SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual;
查询它。
因此,如果您的数据库服务器 OS 设置正确,那么您应该从下周开始获得夏令时(至少对于欧洲而言)
我使用以下命令解决了这个问题
“Select 来自 DUAL 的时区 'GMT' 的 Sytimestamp' 此命令将始终提供 GMT 日期和时间,而不考虑 OS 时间。
在其中一台 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 阅读更多内容。
答案是:视情况而定。
您的数据库总共有 三个 个时区
- 您的会话时区:
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 位客户端)。
- 数据库时区:
DBTIMEZONE
其实这在日常使用中并不是那么重要,它只与TIMESTAMP WITH LOCAL TIME ZONE
数据类型列有关,并定义了存储格式。
这不是SYSDATE
或SYSTIMESTAMP
的时区!!!
如果数据库包含 table 和 TIMESTAMP WITH LOCAL TIME ZONE
列并且该列包含数据,则您无法更改数据库的 DBTIMEZONE
。否则可以使用 ALTER DATABASE SET TIME_ZONE='...';
更改。关闭并重新启动数据库后,更改才会生效。
DBTIMEZONE
在创建数据库时设置。如果在创建数据库时未提供时区,则 Oracle 默认使用服务器操作系统的时区。
- 数据库服务器操作系统的时区:
这个时区与
的结果相关SYSDATE
SYSTIMESTAMP
自然不能在数据库级别更改此时区。如果您所在的国家/地区使用夏令时,则该时区可能每年更改两次。例如,您可以使用 SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual;
查询它。
因此,如果您的数据库服务器 OS 设置正确,那么您应该从下周开始获得夏令时(至少对于欧洲而言)
我使用以下命令解决了这个问题 “Select 来自 DUAL 的时区 'GMT' 的 Sytimestamp' 此命令将始终提供 GMT 日期和时间,而不考虑 OS 时间。