【发布时间】:2024-01-22 21:18:01
【问题描述】:
下午好。
我了解到,在 11 月的第一个星期日(夏令时的关闭日)会重复“一个特定小时的每一分钟的每一秒”(凌晨 1 点 - 凌晨 1:59:59)。因此,当天凌晨 0:00(午夜)到凌晨 3 点的持续时间为 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') FROM 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') FROM DUAL;
对不起,如果我让你感到困惑。如果有任何问题,请告诉我。 有什么帮助吗?
谢谢
维斯瓦
稍后添加: 我想我找到了答案:我们需要使用 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') FROM 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') FROM DUAL;
-- 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') FROM DUAL;
-- 1小时30分钟 -- 因此,从 1:00 到 1:59:59 范围内的任何具有 MST 时区的值都是第二实例值。
【问题讨论】:
-
您可以尝试使用 SYS_EXTRACT_UTC 将其转换为 UTC 时间
-
感谢您的建议。我只是想保持简单,当我通过 MDT、MST 值和 TZD 标志时,这似乎按预期工作。
标签: sql oracle timestamp dst zone