为什么 postgres 的上限函数对于 daterange return 是排他性的?

Why does postgres' upper range function for a daterange return an exclusive bound?

我为此 post 创建了一个 sql fiddle:http://sqlfiddle.com/#!15/7b5d7/1/0

问题 #1

为什么插入具有排他边界的 daterange 的记录实际上存储的是具有包含下限和排他上限的范围?为什么 pg 不将它们都存储为包含边界?

问题 #2

SELECT upper('[2016-06-19, 2016-06-21)'::daterange)returns 2016-06-21。请注意,[ 表示包含下限,) 表示独占上限。

不应该选择上限return2016-06-20吗?日期不是有离散的间隔吗?

回复问题#1:封闭-开放是处理日期范围的标准方式,在学术文献中已有 20-25 年的历史。请参阅 Tom Johnston 的 Bitemporal Data 的第 24-25 页,以及 Richard Snodgrass 在 SQL 中的 Developing Time-Oriented Database Applications .

但我认为原因之一是连续范围没有重叠。如果 a[May2016, Jun2016) 并且 b[Jun2016, Jul2016),则它们不会共享任何天数。所以它们 "snap together",你不必担心它们接触的边缘情况。

请注意,closed-open 的一个缺点(可能)是您不能指定空范围。 [May2016, May2016)简直是自相矛盾,而[May2016, May2016]是瞬间。

回复问题 #2:同样,它可能会有所不同,但我可以想到制作 upper([May2016, Jun2016)) return [=17= 的几个优点]:

  • 无论范围的分辨率如何,它return都是一样的。
  • 它更像是一个开放端点的数学意义,它是唯一可能的答案。
  • 它 return 与 "label" 匹配,因此可以说它并不令人惊讶。
  • 它可以让您轻松查看两个范围 "meet": upper(a) = lower(b).

此外,请注意在 Postgres 中 所有 与时间相关的数据类型都是离散的。曾经有一个选项可以使用基于浮点数的时间戳来编译 Postgres,但它已被弃用,我从未遇到过它。