Oracle 12c 如何处理 DATE 数据类型的时区数据

How does Oracle 12c handle Time Zone data in DATE datatype

我正在使用 Oracle Database 12c。我想知道 oracle 如何管理 DATE 数据类型的时区详细信息。

  1. 如果我要在时区之间迁移数据,我仍然可以使用 DATE 数据类型吗?还是我必须使用 TimeStamp 或 TimeStamp with TimeZone?
  2. 它是否将 UTC 时间保留在数据库中并在根据会话时区或其他一些 NLS 设置查询结果时转换它?

谢谢。

不,数据类型DATE 不处理任何时区信息。使用数据类型 TIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONE

TIMESTAMP WITH TIME ZONE 保存日期+时间+时区

TIMESTAMP WITH LOCAL TIME ZONE 保存日期 + 时间,这些在内部存储在 DBTIMEZONE 中(通常是 UTC)。在当前用户会话时区 SESSIONTIMEZONE.

中显示的值为 always

如果您想将 DATE 转换为 TIMESTAMP WITH {LOCAL} TIME ZONE,则必须告诉 Oracle 应使用哪个时区。

通常你这样做:

FROM_TZ(CAST({date_value} AS TIMESTAMP), 'desired time zone')

强制转换是必需的,因为 FROM_TZ 需要 TIMESTAMP 而不是 DATE

如果您不指定时区,例如像 CAST({date_value} AS TIMESTAMP WITH TIME ZONE) 那么 Oracle 默认时区为 SESSIONTIMEZONE