sql - 重复时间(1 AM-1 :59:59 AM) on first Sunday of November - Daylight Savings ending day - Oracle

标签 sql oracle timestamp dst zone

下午好。

据我所知,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;

The above query is returning 4 hours as expected.

这是我的问题 - 我想基本上区分/表示 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: 未找到时区区域。顺便说一句,我更喜欢使用 US/Mountain(或类似的)区域,而不是 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 的值都是第二个实例值。

最佳答案

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; 更改 session ,则对于 TIMESTAMP '2021-11-07 01:00:00 US/Mountain' Oracle 不默认标准时间而是引发错误:

ORA-01883: overlap was disabled during a region transition

不要将“时区区域”(TRZ) 与“夏令时信息”(TZD) 混淆,但是 MST 可能意味着两者:

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

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

参见Support for Daylight Saving Time

关于sql - 重复时间(1 AM-1 :59:59 AM) on first Sunday of November - Daylight Savings ending day - Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67171396/

相关文章:

sql - 如何在 postgres 中按排序顺序简洁地显示表列列表?

sql - 如何将 bash 变量传递给 sqlplus,然后将该输出传递给另一个变量

Maven 3 和时间戳

sql - 在postgresql中获取当前日期和给定月份之间的日期

mysql - 如何从有 300'000 行的表中选择 n 行

mysql - 如何将具有 188 万行的 .csv 文件中的数据导入 MySQL

sql - NTILE 的动态参数

oracle - ORA-01849 : hour must be between 1 and 12

sql - 如何创建慢速 SQL 查询?

c++ - 在 C++ 中可靠地比较不同机器的时间戳