【发布时间】:2015-07-05 20:48:21
【问题描述】:
Postgres 带有一个名为Range Types 的好功能,它提供了有用的范围功能(重叠、包含等)。
我希望使用daterange 类型,但是我认为该类型是通过一个尴尬的选择实现的:日期范围的上限是排除。这意味着,如果我将值定义为 2014/01/01 - 2014/01/31,则会显示为 [2014/01/01, 2014/01/31),并且 1 月 31 日将排除范围!
我认为这是错误的默认选择。我想不出现实生活中的任何应用程序或参考资料都假定日期范围的结束日期被排除在外。至少我的经验不是。
我想为包含下限和上限的日期实现一个范围类型,但我遇到了 Postgres 文档墙:关于如何创建新的离散范围类型的参考资料很神秘,并且缺少任何示例(取自文档:Creating a canonical function is a bit tricky, since it must be defined before the range type can be declared)。
有人可以提供一些帮助吗?甚至直接实现本身;应该是 5-10 行代码,但是将这 5-10 行代码放在一起是一项严肃的研究工作。
编辑:澄清:我正在寻找有关如何创建正确类型的信息,以便插入[2014/01/01, 2014/01/31] 导致upper(daterange) = '2014/01/31'。对于现有的 daterange 类型,此值“转换”为 [2014/01/01, 2014/02/01) 并给出 upper(daterange) = '2014/02/01'
【问题讨论】:
-
Postgres 范围类型始终转换为规范形式
[)。如果您需要呈现[A,B],则在呈现给用户之前处理该值。 -
正确。 Postgres 还说你可以定义范围类型,其规范形式不是默认的
[),而是任何你想要的。我一直在寻找能够减轻我的应用程序必须执行该处理的类型,而我现在在查询和插入数据时都必须这样做。 -
我想不出现实生活中包含结束日期的单个应用程序或参考。如果我在酒店预订,我不会在结束日期停留,而是在到达日期,因此不包括结束日期。这就是为什么它是默认值。
-
预订确实是我所说的一个很好的反例。想想任何类型的交互式报告。例如,您正在查看一家公司的销售报告,并且有一个日期范围下拉菜单可让您过滤特定日期。您单击开始日期和结束日期,并且总是意味着将它们都包括在内。我写这篇文章时正在开发的应用程序让用户输入他们选择的日期范围的特定数据,并且选择结束日期总是意味着包含它。
-
@MatthewSchinckel 的回答是正确的。日期范围的输出规范形式是 [)。例如 select daterange('20200101' , '20201220' , []) as range1 返回输出 [2020-01-01, 2020-12-21) 和 select daterange('20200101' , '20201220' , () ) as range2 返回 [2020-01-02, 2020-12-21) 的输出
标签: postgresql date-range