我在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
相等的方式相同的方式处理时区的方式来评估相等性?
答案 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标准定义,但是 定义表现出导致可疑用途的特性。 在大多数情况下,date
,time
,timestamp without time zone
和timestamp with time zone
的组合应提供完整的范围 任何应用程序所需的日期/时间功能。