【问题标题】:Oracle SQL: get timezone for a given dateOracle SQL:获取给定日期的时区
【发布时间】:2014-12-30 06:52:48
【问题描述】:

如何根据以下信息准确确定给定日期(DATE data_type 列)的时区?

a) DATE 列不存储时区信息。

b) 服务器时区是 EST 还是 EDT,具体取决于日期光节约是否生效

c) SQL 可以很容易地获取当前时区偏移量:

SELECT TO_CHAR(SYSTIMESTAMP,'TZH:TZM') FROM DUAL

假设今天(2014 年 11 月 3 日)的时区是 EST,我们如何以编程方式确定给定日期(例如 2014 年 10 月 21 日)的有效时区(即 EST 或 EDT)?

【问题讨论】:

  • 时区基于地理。您将需要位置数据以及日期时间对象。
  • 您需要一个表格来说明您的服务器位置何时发生夏令时更改。

标签: sql oracle date datetime timezone


【解决方案1】:

Oracle 支持IANA time zones。美国东部时区由"America/New_York" 表示。

您可以使用FROM_TZTIMESTAMP 值创建TIMESTAMP WITH TIME ZONE。 (如果您是从DATE 开始,那么您应该先转换为TIMESTAMP。)

然后您可以使用TO_CHAR'TZH:TZM' 一起获得偏移量,或与'TZD' 一起获得缩写(例如EST 或EDT)。

例如:

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-02 00:00:00', 'America/New_York'),'TZD')
FROM DUAL;  -- Output: 'EDT'

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-02 00:00:00', 'America/New_York'),'TZH:TZM')
FROM DUAL;  -- Output: '-04:00'

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-03 00:00:00', 'America/New_York'),'TZD')
FROM DUAL;  -- Output: 'EST'

SELECT TO_CHAR(FROM_TZ(TIMESTAMP '2014-11-03 00:00:00', 'America/New_York'),'TZH:TZM')
FROM DUAL;  -- Output: '-05:00'

【讨论】:

  • 绝对的天才。我的 Oracle 服务器仅支持 DATE 数据类型,并且 FROM_TZ “未启用可选功能”。但是将 FROM_TZ 包装在 TO_CHAR 中仍然会给我每条记录日期的偏移量。
猜你喜欢
  • 2011-12-21
  • 2013-05-08
  • 2017-06-08
  • 2017-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多