首页 > 解决方案 > 11 月第一个星期日的重复时间 (1 AM-1:59:59 AM) - 夏令时结束日 - Oracle

问题描述

下午好。

我了解在 11 月的第一个星期日(夏令时结束日)重复“一个特定小时的每一分钟的每一秒”(凌晨 1 点 - 凌晨 1:59:59)。因此,从 0:00 AM(午夜)到 3 AM 的持续时间是当天的 4 小时。

SELECT TO_TIMESTAMP_TZ('2021-11-07 03:00:00 US/Mountain', 'yyyy-mm-dd hh24:mi:ss TZR') - TO_TIMESTAMP_TZ('2021-11-07 00:00:00 US/Mountain ', 'yyyy-mm-dd hh24:mi:ss TZR') 来自 DUAL;

上述查询按预期返回 4 小时。

这是我的问题-我想基本上区分/表示两次出现的 1 AM(或 1 AM 和 1:59:59 AM 之间的任何时间)。我能怎么做?(我使用的是 Oracle 12.1)

顺便说一句,以下查询的结果为 1 小时 30 分钟,因此“2021-11-07 01:30:00 MST”表示凌晨 1:30 的第二个实例。同样,我期望“2021-11-07 01:30:00 MDT”是第一个实例,但结果是 ORA-01882: timezone region not found。顺便说一句,我更喜欢在地区使用美国/山地(或类似的东西),而不是 MST 与 MDT

SELECT TO_TIMESTAMP_TZ('2021-11-07 03:00:00 MST', 'yyyy-mm-dd hh24:mi:ss TZR') - TO_TIMESTAMP_TZ('2021-11-07 01:30:00 MST', 'yyyy -mm-dd hh24:mi:ss TZR') 来自双重;

对不起,如果我让你感到困惑。如果有任何问题,请告诉我。有什么帮助吗?

谢谢

维斯瓦


后来补充:我想我找到了答案:我们需要使用 TZD 标志,并使用 MST/MDT 值。我不喜欢这样,因为我更喜欢使用该地区(例如美国/山区)。因此,任何增强都将不胜感激。

SELECT TO_TIMESTAMP_TZ('2021-11-07 03:00:00 US/Mountain', 'yyyy-mm-dd hh24:mi:ss TZR') - TO_TIMESTAMP_TZ('2021-11-07 00:00:00 US/Mountain ', 'yyyy-mm-dd hh24:mi:ss TZR') 来自 DUAL;

-- 4 小时 00 分钟,如预期的那样

SELECT TO_TIMESTAMP_TZ('2021-11-07 03:00:00 MST', 'yyyy-mm-dd hh24:mi:ss TZD') - TO_TIMESTAMP_TZ('2021-11-07 01:30:00 MDT', 'yyyy -mm-dd hh24:mi:ss TZD') 来自双重;

-- 2:30 分钟 -- 因此,从 1:00 到 1:59:59 范围内的任何具有 MDT 时区的值都是第一个实例值。

SELECT TO_TIMESTAMP_TZ('2021-11-07 03:00:00 MST', 'yyyy-mm-dd hh24:mi:ss TZD') - TO_TIMESTAMP_TZ('2021-11-07 01:30:00 MST', 'yyyy -mm-dd hh24:mi:ss TZD') 来自双重;

-- 1 小时:30 分钟 -- 因此,从 1:00 到 1:59:59 的任何值,时区为 MST,都是第二个实例值。

标签: sqloracletimestampdstzone

解决方案


TIMESTAMP '2021-11-07 01:00:00 US/Mountain'不明确,可能是 2021-11-07 01:00:00-06:002021-11-07 01:00:00-07:00

如果您未指定夏令时状态,则 Oracle 默认为标准时间,(在您的情况下为 MST)

您需要同时提供时区区域和夏令时信息,即TO_TIMESTAMP_TZ('2021-11-07 01:00:00 US/Mountain MST', 'yyyy-mm-dd hh24:mi:ss TZR TZD')TO_TIMESTAMP_TZ('2021-11-07 01:00:00 US/Mountain MDT', 'yyyy-mm-dd hh24:mi:ss TZR TZD')

请注意,如果您在不明确的时间内更改会话,ALTER SESSION SET ERROR_ON_OVERLAP_TIME = TRUE;例如TIMESTAMP '2021-11-07 01:00:00 US/Mountain'Oracle 不会默认为标准时间,但会引发错误:

ORA-01883: 在区域转换期间禁用了重叠

不要将“时区区域” TRZTZDMST

SELECT *
FROM V$TIMEZONE_NAMES
WHERE TZABBREV in ('MST', 'MDT');

值的计算TIMESTAMP WITH TIME ZONE始终在内部按 UTC 时间执行。

请参阅支持夏令时


推荐阅读