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

问题描述:

有没有办法告诉PostgreSQL输出包含结束日期的日期范围?PostgreSQL:如何获得包含结束日期的日期范围?

例如,如果我运行此:

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

输出是:

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

这实在是烦人的,因为我得到什么从数据库返回的不匹配我投入的东西。

+0

你确实收回你放入的东西。两个范围都是相同的。 '[2016-09-01,2016-09-10]':: daterange ='[2016-09-01,2016-09-11)':: daterange'产生'true' –

这真的是安oying,因为我所得到的从数据库返回的不匹配是我的配制。

输出[2016-09-01,2016-09-11)包容日期2016-09-10的。

)终了的上限的范围内的装置,以排除2016-09-11而是包括之前它落入的日期,即2016-09-10和下方。

请参阅documentation以获得更深入的语法讨论。

此行为是故意的,并有坚实的原因。 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