在编写一个接受来自用户的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)
有人能说清楚这个吗?
答案 0 :(得分:6)
混淆源于两个不同的“无限”含义。
timestamp
类型接受special values for infinity
and -infinity
。lower_inf()
and upper_inf()
,但它们实际上是在测试范围内的“无约束”。没有上限/下限的范围分别包含 值 infinity
/ -infinity
{/ 1}}。此外,某些元素类型具有“无穷大”的概念,但这只是 关于范围类型机制的另一个值。对于 例如,在时间戳范围内,
timestamp
表示与之相同的内容[today,]
。但是[today,)
意味着不同的东西[today,infinity]
- 后者排除特殊时间戳值[today,infinity)
。
也许这些函数应该被称为infinity
和lower_nobound()
,以避免混淆......