Sql 11月第一个星期日的重复时间(凌晨1:00-1:59:59)-夏令时结束日-Oracle

Sql 11月第一个星期日的重复时间(凌晨1:00-1:59:59)-夏令时结束日-Oracle,sql,oracle,timestamp,dst,zone,Sql,Oracle,Timestamp,Dst,Zone,下午好 据我所知,11月第一个星期日夏时制结束日的凌晨1点至1:59:59,每分钟每秒钟重复一个特定小时。因此,从午夜0:00到凌晨3点的持续时间是当天的4小时 选择时间戳“2021-11-07 03:00:00美国/山区”, 'yyyy mm dd hh24:mi:ss TZR' -从DUAL发送至时间戳“2021-11-07 00:00:00美国/山区”,“yyyy-mm dd hh24:mi:ss TZR” 上述查询返回的时间为预期的4小时 这是我的问题- 我想基本上区分/表示凌晨1点或凌

下午好

据我所知,11月第一个星期日夏时制结束日的凌晨1点至1:59:59,每分钟每秒钟重复一个特定小时。因此,从午夜0:00到凌晨3点的持续时间是当天的4小时

选择时间戳“2021-11-07 03:00:00美国/山区”, 'yyyy mm dd hh24:mi:ss TZR' -从DUAL发送至时间戳“2021-11-07 00:00:00美国/山区”,“yyyy-mm dd hh24:mi:ss TZR”

上述查询返回的时间为预期的4小时

这是我的问题- 我想基本上区分/表示凌晨1点或凌晨1点和凌晨1:59:59之间的任何时间的两个事件。我该怎么办?我正在使用Oracle 12.1

顺便说一句,以下查询的结果是1小时30分钟,因此“2021-11-07 01:30:00 MST”表示1:30 AM的第二个实例。以同样的方式,我希望“2021-11-07 01:30:00 MDT”是第一个实例,但结果是找不到ORA-01882:时区区域。顺便说一句,我更喜欢美国/山区或类似的地区,而不是MST与MDT

选择时间戳“2021-11-07 03:00:00 MST”,“yyyy-mm-dd” hh24:mi:ss TZR' -从DUAL发送至时间戳“2021-11-07 01:30:00 MST”,“yyyy-mm dd hh24:mi:ss TZR”

对不起,我把你弄糊涂了。如果有任何问题,请告诉我。 有什么帮助吗

多谢各位

维斯瓦

稍后添加: 我想我找到了答案:我们需要使用TZD标志,并使用MST/MDT值。 我不喜欢这样,因为我更喜欢使用美国/山区等地区。 因此,如有任何改进,我们将不胜感激

选择时间戳“2021-11-07 03:00:00美国/山区”, 'yyyy mm dd hh24:mi:ss TZR' -从DUAL发送至时间戳“2021-11-07 00:00:00美国/山区”,“yyyy-mm dd hh24:mi:ss TZR”

-4小时:00分钟,如预期

选择时间戳“2021-11-07 03:00:00 MST”,“yyyy-mm-dd” hh24:mi:ss TZD' -从DUAL发送至时间戳“2021-11-07 01:30:00 MDT”,“yyyy-mm dd hh24:mi:ss TZD”

-2:30分钟 -因此,时区为MDT的1:00到1:59:59之间的任何值都是第一个实例值

选择时间戳“2021-11-07 03:00:00 MST”,“yyyy-mm-dd” hh24:mi:ss TZD' -从DUAL发送至时间戳“2021-11-07 01:30:00 MST”,“yyyy-mm dd hh24:mi:ss TZD”

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

值时间戳“2021-11-07 01:00:00 US/Mountain”不明确,可能是 2021-11-07 01:00:00-06:00或2021-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更改会话;然后,对于时间戳“2021-11-07 01:00:00 US/Mountain”等不明确的时间,Oracle不会默认为标准时间,但会引发错误:

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

不要将时区TRZ与夏令时信息TZD混淆,但MST可能同时表示:

SELECT *
FROM V$TIMEZONE_NAMES
WHERE TZABBREV in ('MST', 'MDT');
带有时区值的时间戳的计算始终在UTC时间内执行


请参见

您可以尝试使用SYS\u EXTRACT\u UTC将其转换为UTC时间谢谢您的建议。我只想保持简单,当我传递MDT、MST值和TZD标志时,这似乎像预期的那样工作。我理解并同意提供US/Mountain TZR和MST/MDT TZD来消除混淆。我还喜欢将ERROR\u ON\u OVERLAP\u TIME设置为TRUE,以避免MST的默认值。