gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:41:25 25 4
gpt4 key购买 nike

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

问题#1

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

问题#2

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

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

最佳答案

关于问题 #1:closed-open 是处理日期范围的标准方法,在学术文献中已有 20-25 年的历史。请参阅 Tom Johnston 的 Bitemporal Data 第 24-25 页,以及 Richard Snodgrass 的 Developing Time-Oriented Database Applications in SQL

但我认为原因之一是连续范围没有重叠。如果a[May2016, Jun2016)并且b[Jun2016, Jul2016),他们不共享任何日子。因此它们“咬合在一起”,您不必担心它们接触的边缘情况。

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

关于问题 #2:同样,它可能会有所不同,但我可以想到使 upper([May2016, Jun2016)) return 的几个优点2016 年 6 月:

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

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

关于postgresql - 为什么 postgres 的日期范围上限函数会返回一个独占边界?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953786/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com