PostgreSQL:如何获得包含结束日期的日期范围?
问题描述:
有没有办法告诉PostgreSQL输出包含结束日期的日期范围?PostgreSQL:如何获得包含结束日期的日期范围?
例如,如果我运行此:
SELECT '[2016-09-01,2016-09-10]'::daterange
输出是:
[2016-09-01,2016-09-11)
这实在是烦人的,因为我得到什么从数据库返回的不匹配我投入的东西。
答
这真的是安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。
你确实收回你放入的东西。两个范围都是相同的。 '[2016-09-01,2016-09-10]':: daterange ='[2016-09-01,2016-09-11)':: daterange'产生'true' –