如何使用 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 显示两个不同区域中时间戳之间的实时差异?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 Mongoose/NodeJS 中时间戳字段中的不同日期项?

计算 BigQuery 中时间戳之间的平均延迟

数组中时间戳之间的平均间隔

Hadoop SQL 中时间戳数据类型的奇怪行为

Mysql查询将返回数据库中时间戳之间的空闲槽

python中时间戳,datetime 和时间字符串之间得转换