为什么postgres' daterange的上限函数返回一个独占边界?

时间:2016-06-21 20:15:08

标签: postgresql postgresql-9.3

我为这篇文章创建了一个sql小提琴:http://sqlfiddle.com/#!15/7b5d7/1/0

问题#1

为什么插入具有独占边界的daterange的记录实际上存储了包含下限和独占上限的范围?为什么不将它们作为包容性边界存储?

问题#2

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

不应该选择上限回报2016-06-20吗?不是日期有不连续的间隔吗?

1 个答案:

答案 0 :(得分:5)

重新问题#1 :封闭式开放是处理日期范围的标准方式,在学术文献中有20 - 25年的历史。请参阅Tom Johnston撰写的 Bitemporal Data 第24-25页,以及Richard Snodgrass撰写的在SQL中开发面向时间的数据库应用程序

但我认为其中一个原因是连续范围没有重叠。如果a[May2016, Jun2016)b[Jun2016, Jul2016),则他们不会分享任何日期。所以他们一起拍摄#34;并且你不必担心他们碰到的边缘情况。

请注意,封闭开放的一个缺点(可能)是您无法指定空范围。 [May2016, May2016)只是一种自相矛盾,而[May2016, May2016]只是一种瞬间。

重新问题#2 :同样可能会有所不同,但我可以想到让upper([May2016, Jun2016))返回Jun2016的几个好处:

  • 无论范围的分辨率如何,它都会返回相同的内容。
  • 它更像是开放式端点的数学含义,它只是 可能的答案。
  • 它会返回与"标签"匹配的内容,所以可以说它不那么令人惊讶。
  • 它可让您轻松查看两个范围是否符合":upper(a) = lower(b)

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