小编典典

时区相等的Postgres时间

sql

time with time zone在Postgres的平等问题上遇到了麻烦。 timestamp with time zone平等的工作方式与我期望的一样,如果在对时区进行归一化之后,如果时间相同,那么它应该为真:

postgres=# select '2013-06-27 12:00:00 -0800'::timestamp with time zone = '2013-06-27 14:00:00 -0600'::timestamp with time zone;
 ?column?
----------
 t

但是,似乎不适用于以下情况time with time zone

postgres=# select '12:00:00 -0800'::time with time zone = '14:00:00 -0600'::time with time zone;
 ?column?
----------
 f

但是,不平等在我期望他们如何实现的过程中起作用:

postgres=# select '12:00:00 -0800'::time with time zone < '14:01:00 -0600'::time with time zone;
 ?column?
----------
 t

postgres=# select '12:00:00 -0800'::time with time zone > '13:59:00 -0600'::time with time zone;
 ?column?
----------
 t

我有什么误会time with time zone吗?如何以与timestamp with time zone平等相同的方式处理时区来评估平等?


阅读 206

收藏
2021-05-05

共1个答案

小编典典

以下是两种评估timetz平等的方法:

SELECT a, b, a = b AS plain_equality
      ,'2000-1-1'::date + a = '2000-1-1'::date + b AS ts_equality
      ,a AT TIME ZONE 'UTC', b AT TIME ZONE 'UTC'  AS timetz_equality
FROM (
   SELECT '12:00:00 -0800'::timetz AS a, '14:00:00 -0600'::timetz AS b
   ) sub;

第一个 将它添加到一个date。该 第二 通过使用AT TIME ZONE构建体

但不要使用time with time zone。曾经。
Postgres仅支持该类型,因为它在SQL标准中。但是它是设计破坏的(不能考虑DST!),不建议使用。

这里引用手册:

类型time with time zone是由SQL标准定义的,但是定义显示的属性会导致有用的疑问。在大多数情况下,组合datetimetimestamp without time zone,和timestamp with time zone应提供的任何应用程序所需要的日期/时间功能的完整范围。

2021-05-05