Postgres时间与时区平等

时间:2013-12-11 20:29:06

标签: sql postgresql time timezone

我在Postgres中遇到time with time zone平等的问题。 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相等的方式相同的方式处理时区的方式来评估相等性?

1 个答案:

答案 0 :(得分:4)

以下是评估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 second 使用AT TIME ZONE construct

但是不要使用time with time zone。永远。
Postgres仅支持该类型,因为它符合SQL标准。但它被设计破坏了(不能考虑DST!)并且不鼓励使用它。

引用手册here

  

类型time with time zone由SQL标准定义,但是   定义表现出导致可疑用途的特性。   在大多数情况下,datetimetimestamp without time zonetimestamp with time zone的组合应提供完整的范围   任何应用程序所需的日期/时间功能。

相关问题