PostgreSQL tsrange:对于lower_inf('( - infinity,today)':: tsrange),它是否正确?

时间:2014-11-24 11:19:13

标签: postgresql postgresql-9.3 infinity range-types

在编写一个接受来自用户的tsrange文字的程序的过程中,然后插入到各种SQL查询中,今天我正在测试一些tsrange,看看它们是如何被PostgreSQL 9.3.5解释的。

特别是这个行为奇怪:'( - 无限,今天)' :: tsrange

lower_inf函数表示下限不是无限(!)

test=> SELECT lower_inf('(-infinity,today)'::tsrange);
 lower_inf
-----------
 f
(1 row)

然而,PostgreSQL报告说这个tsrange包含一个时间戳,如' 1000-01-01 BC' 。 。

test=> SELECT '(-infinity,today)'::tsrange @> '1000-01-01 BC'::timestamp;
 ?column? 
----------
 t
(1 row)

有人能说清楚这个吗?

1 个答案:

答案 0 :(得分:6)

混淆源于两个不同的“无限”含义

  1. timestamp类型接受special values for infinity and -infinity
  2. 范围类型对于没有下限/上限的范围具有一般概念。测试它的函数称为lower_inf() and upper_inf(),但它们实际上是在测试范围内的“无约束”。没有上限/下限的范围分别包含 infinity / -infinity {/ 1}}。
  3. The manual:

      

    此外,某些元素类型具有“无穷大”的概念,但这只是   关于范围类型机制的另一个值。对于   例如,在时间戳范围内,timestamp表示与之相同的内容   [today,]。但是[today,)意味着不同的东西   [today,infinity] - 后者排除特殊时间戳值[today,infinity)

    SQL Fiddle.

    也许这些函数应该被称为infinitylower_nobound(),以避免混淆......