我time with time zone在Postgres的平等问题上遇到了麻烦。 timestamp with time zone平等的工作方式与我期望的一样,如果在对时区进行归一化之后,如果时间相同,那么它应该为真:
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平等相同的方式处理时区来评估平等?
以下是两种评估timetz平等的方法:
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构建体。
date
AT TIME ZONE
但不要使用time with time zone。曾经。 Postgres仅支持该类型,因为它在SQL标准中。但是它是设计破坏的(不能考虑DST!),不建议使用。
在这里引用手册:
类型time with time zone是由SQL标准定义的,但是定义显示的属性会导致有用的疑问。在大多数情况下,组合date,time,timestamp without time zone,和timestamp with time zone应提供的任何应用程序所需要的日期/时间功能的完整范围。
time
timestamp without time zone