如何使用 SQL 显示两个不同区域中时间戳之间的实时差异?
Posted
技术标签:
【中文标题】如何使用 SQL 显示两个不同区域中时间戳之间的实时差异?【英文标题】:How to show real time difference between timestamps in two different zones with SQL? 【发布时间】:2022-01-19 11:21:09 【问题描述】:此查询返回 0
SELECT (CURRENT_TIMESTAMP AT TIME ZONE 'PST'
- CURRENT_TIMESTAMP AT TIME ZONE 'UTC') AS td
FROM dual
如何才能真正显示出真正的时间差异?例如,在这种情况下,我希望看到 -8 小时的差异。
在此示例中,我使用了 CURRENT_TIMESTAMP,但我有一个真实的用例,其中我有两个不同时区的时间戳。我想要这两者之间的实时差异。
【问题讨论】:
【参考方案1】:将值转换为不带时区的TIMESTAMP
:
SELECT CAST(CURRENT_TIMESTAMP AT TIME ZONE 'PST' AS TIMESTAMP)
- CAST(CURRENT_TIMESTAMP AT TIME ZONE 'UTC' AS TIMESTAMP)
as td
FROM DUAL;
哪些输出:
TD -000000000 08:00:00.000000
或者,考虑 DST 边界周围的时间:
-- Times around the DST boundary.
WITH times (t) AS (
SELECT TIMESTAMP '2021-03-14 09:30:00 UTC' FROM DUAL UNION ALL
SELECT TIMESTAMP '2021-03-14 10:30:00 UTC' FROM DUAL
)
SELECT t As t_utc,
t AT TIME ZONE 'PST8PDT' AS t_pstpdt,
(CAST(t AT TIME ZONE 'PST8PDT' AS TIMESTAMP)
- CAST(t AT TIME ZONE 'UTC' AS TIMESTAMP)) AS td
FROM times
输出:
T_UTC T_PSTPDT TD 2021-03-14 09:30:00.000000000 UTC 2021-03-14 01:30:00.000000000 PST8PDT -000000000 08:00:00.000000 2021-03-14 10:30:00.000000000 UTC 2021-03-14 03:30:00.000000000 PST8PDT -000000000 07:00:00.000000
db小提琴here
【讨论】:
太棒了!谢谢。【参考方案2】:所以,您想找出时区之间的时差。 (这不是标题所说的;标题具有误导性。)
如果是这样,那么您不需要引用 current_timestamp
或任何类似的东西。
由于您将 PST 与 UTC 进行比较,因此这与查找 PST 的 UTC 偏移量相同。这使问题变得更加容易。 (在一般情况下,您可以找到两个时区的偏移量并减去;在您的示例中,UTC 与自身的偏移量显然为零)。
select to_char(to_timestamp_tz('PST', 'tzr'), 'tzh:tzm') as pst_offset
from dual;
PST_OFFSET
----------
-08:00
【讨论】:
这将在当月开始时的午夜找到从 PST 到 UTC 的时区差异(因为您使用TO_TIMESTAMP_TZ
而不指定所有日期时间组件)这可能不是什么OP 在后面。如果您在夏令时更改之后的同一个月内使用它,而返回的结果是在夏令时更改之前而不是之后,这可能会产生意想不到的结果。 db<>fiddle
@MT0 - PST 是“标准”时区,它没有 DST 功能。 OP 提出的问题仅对此类时区有意义。如果 DST 在起作用,那么给出时间戳(没有时区)并询问两个时区之间的时差是不明确的;例如,时间戳可能存在于一个时区但不存在于另一个时区(如果它在一个时区从夏季时间到冬季时间时被跳过,但另一个时区没有 DST,或者在不同日期有 DST) .这些都是我选择不讨论的事情,因为它们似乎无关紧要。
@MT0 - 在您的解决方案中,如果您想考虑 PDT 而不是 PST(例如 'America/Los_Angeles
),如果您的所有设置都使用 UTC(即当前时间戳等),请尝试查询,并且您在当前时间是太平洋夏令时从冬季到夏季时间的当天凌晨 2:30 时使用您的查询。你会得到一个错误。以上是关于如何使用 SQL 显示两个不同区域中时间戳之间的实时差异?的主要内容,如果未能解决你的问题,请参考以下文章