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

smi*_*arm 4 postgresql infinity range-types postgresql-9.3

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

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

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

test=> SELECT lower_inf('(-infinity,today)'::tsrange);
 lower_inf
-----------
 f
(1 row)
Run Code Online (Sandbox Code Playgroud)

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

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

任何人都可以阐明这一点吗?

Erw*_*ter 6

混乱源于这里"无限"的两种不同含义.

  1. timestamp类型接受特殊值infinity-infinity.
  2. 范围类型对于没有下限/上限的范围具有一般概念.该功能来测试它被称为lower_inf()upper_inf(),但他们确实在测试范围为"无界".范围没有上限/下限包括 infinity/-infinitytimestamp分别.

手册:

此外,一些元素类型具有"无穷大"的概念,但就范围类型机制而言,这只是另一个值.例如,在时间戳范围内,[today,]意味着与之相同 [today,).但[today,infinity]意味着不同的东西 [today,infinity)- 后者排除了特殊的时间戳值infinity.

SQL小提琴.

也许这些功能应该被称为类似的东西lower_nobound()upper_nobound()避免混淆......