我为这篇文章创建了一个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
吗?不是日期有不连续的间隔吗?
答案 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,但它已被弃用,我从未遇到它。