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

时间:2016-09-16 03:06:03

标签: postgresql

有没有办法告诉PostgreSQL输出一个包含结束日期的日期范围?

例如,如果我运行它:

SELECT '[2016-09-01,2016-09-10]'::daterange

输出结果为:

[2016-09-01,2016-09-11)

这真令人讨厌,因为我从数据库中找回的内容与我输入的内容不符。

2 个答案:

答案 0 :(得分:1)

此行为是故意的,并且有充分的理由。 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!

了解Discrete Range Types

答案 1 :(得分:0)

  

这真令人讨厌,因为我从数据库中找回的内容与我输入的内容不符。

输出[2016-09-01,2016-09-11) 包含日期2016-09-10

结束范围上限的)意味着排除 2016-09-11,但包括之前的日期,即{ {1}}及以下。

有关语法的深入讨论,请参阅documentation