PostgreSQL:如何获取包含结束日期的日期范围?

4
有没有办法告诉PostgreSQL以包含结束日期的方式输出日期范围?
例如,如果我运行以下命令: SELECT '[2016-09-01,2016-09-10]'::daterange 输出结果为: [2016-09-01,2016-09-11) 这真的很烦人,因为我从数据库中获得的内容与我输入的不匹配。

1
你所付出的就是你所得到的。两个范围是相同的。'[2016-09-01,2016-09-10]'::daterange = '[2016-09-01,2016-09-11)'::daterange 的结果为 true - user330315
1个回答

4
这种行为是有意为之并且有充分的理由。 daterange 是一种离散的范围类型,这意味着它会将所有输入值转换为它们的规范形式。 这样就可以比较不同形式的相同范围。
select '[2016-09-01,2016-09-10]'::daterange = '[2016-09-01,2016-09-11)'::daterange;
-- yields true

您可以创建自己的范围类型:
create type mydaterange as range
   (subtype=date,
    subtype_diff=daterange_subdiff);

select '[2016-09-01,2016-09-10]'::daterange, '[2016-09-01,2016-09-10]'::mydaterange

        daterange        |       mydaterange       
-------------------------+-------------------------
 [2016-09-01,2016-09-11) | [2016-09-01,2016-09-10]
(1 row)

但在这种情况下,这个说法没有什么意义。
select '[2016-09-01,2016-09-10]'::mydaterange = '[2016-09-01,2016-09-11)'::mydaterange;
-- yields false!

阅读关于离散范围类型的内容。


为了使您的最后一个查询返回true,您可以/应该为新的范围类型提供一个“规范”函数。然而,我找不到任何编写这种函数或文档的示例,除了它是“有点棘手”的(https://www.postgresql.org/docs/current/sql-createtype.html)。编写这样的函数似乎需要C语言(自2012年以来可能已经改变)。 - vicvicvic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接