为什么postgres的日期范围的上限函数返回一个独占边界?

Kur*_*ler 3 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?日期是否有不连续的间隔?

Pau*_*rth 5

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

但我认为其中一个原因是连续范围没有重叠.如果a[May2016, Jun2016)b[Jun2016, Jul2016),它们不共享任何天.所以他们"拼凑",你不必担心他们触摸的边缘情况.

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

问题2:同样也有可能是不同的,但我能想到的做的几个优点upper([May2016, Jun2016))回报Jun2016:

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

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