11 月的第一个星期日 - 夏令时结束日 - Oracle 的重复时间(凌晨 1 点 - 凌晨 1:59:59)
Repeating time (1 AM-1:59:59 AM) on first Sunday of November - Daylight Savings ending day - Oracle
下午好。
我了解到在 11 月的第一个星期日(夏令时结束日)(凌晨 1 点 - 1:59:59 上午)重复“一个特定小时的每一分钟的每一秒”。因此,当天从 0:00 AM(午夜)到凌晨 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.
这是我的问题 -
我基本上想 differentiate/represent 凌晨 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: timezone region not found。顺便说一句,我更喜欢区域 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 值。
我不喜欢这样,因为我更喜欢使用区域(例如 US/Mountain)。
因此,我们将不胜感激。
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 hours: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 hour:30 分钟
-- 因此,从 1:00 到 1:59:59 范围内且时区为 MST 的任何值都是第二个实例值。
值TIMESTAMP '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;
更改会话,那么对于诸如 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 时间执行。
下午好。
我了解到在 11 月的第一个星期日(夏令时结束日)(凌晨 1 点 - 1:59:59 上午)重复“一个特定小时的每一分钟的每一秒”。因此,当天从 0:00 AM(午夜)到凌晨 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.
这是我的问题 - 我基本上想 differentiate/represent 凌晨 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: timezone region not found。顺便说一句,我更喜欢区域 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 值。 我不喜欢这样,因为我更喜欢使用区域(例如 US/Mountain)。 因此,我们将不胜感激。
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 hours: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 hour:30 分钟 -- 因此,从 1:00 到 1:59:59 范围内且时区为 MST 的任何值都是第二个实例值。
值TIMESTAMP '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;
更改会话,那么对于诸如 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 时间执行。