为什么PostgreSQL构造daterange时生成的区间边界不符合预期?
PostgreSQL daterange闭区间查询返回左闭右开格式的原因
这是PostgreSQL范围类型的标准归一化设计,专门针对离散数据类型做了统一处理,具体逻辑如下:
date类型的最小取值粒度为1天,属于离散数据类型,不存在比1天更小的合法date值。当你指定上界为闭区间包含2021-09-10时,等效于覆盖到2021-09-10的最后一刻,刚好对应2021-09-11的起始时刻前,因此PostgreSQL会自动将离散类型的区间统一归一化为左闭右开的标准存储展示格式,让所有区间运算逻辑保持统一。- 不止
daterange,其余离散类型的范围类型(包括int4range、int8range等)都遵循该规则,比如执行SELECT int4range(1,10,'[]');返回结果为[1,11),逻辑完全一致。 - 该归一化不会改变你指定的查询逻辑,实际区间仍包含上下界指定的所有日期:
执行验证查询SELECT '2021-09-10'::date <@ daterange('2021-09-01', '2021-09-10', '[]');,返回结果为t(真),说明2021-09-10属于区间;
执行SELECT '2021-09-11'::date <@ daterange('2021-09-01', '2021-09-10', '[]');,返回结果为f(假),说明2021-09-11不属于区间,完全符合你指定上下界均包含的需求。 - 如果你使用的是连续类型的范围类型(比如
tsrange时间戳区间,最小粒度可到微秒),指定[]闭区间时不会做这类归一化,会直接返回你指定的上下界闭区间格式。
内容的提问来源于stack exchange,提问作者morfair
相关产品推荐
相关产品推荐

