gpt4 book ai didi

postgresql - 如何在 Postgres 中创建包含上限的新日期范围类型?

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

Postgres 有一个很好的特性叫做 Range Types提供有用的范围功能(重叠、包含等)。

我希望使用 daterange 类型,但我认为该类型是通过一个尴尬的选择实现的:排除了 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 '

最佳答案

注意第三个构造函数参数:

select daterange('2014/01/01', '2014/01/31', '[]');
daterange
-------------------------
[2014-01-01,2014-02-01)

或包含上限的直接转换:

select '[2014/01/01, 2014/01/31]'::daterange;
daterange
-------------------------
[2014-01-01,2014-02-01)

编辑

不是新类型(错误的方法恕我直言)而是正确的功能:

create function inclusive_upper_daterange(dtr daterange)
returns date as $$

select upper(dtr) - 1;

$$ language sql immutable;

select inclusive_upper_daterange('[2014/01/01, 2014/01/31]'::daterange);
inclusive_upper_daterange
---------------------------
2014-01-31

关于postgresql - 如何在 Postgres 中创建包含上限的新日期范围类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29895077/

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