Postgresql 将日期范围的上限更新为无穷大

Postgresql 将日期范围的上限更新为无穷大,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,如何只更新daterange列的上限的语法让我感到困惑 我希望下限保持不变,如果daterange列(例如timespan)包含某个界限(例如2013-12-31),则只将其上限更新为“无穷大” 就我所知: UPDATE table SET timespan = daterange(lower(timespan),upper(infinity)::daterange) WHERE (upper(timespan) = '2013-12-31'::daterange); 您没有告诉我们您遇到了什

如何只更新daterange列的上限的语法让我感到困惑

我希望下限保持不变,如果daterange列(例如timespan)包含某个界限(例如2013-12-31),则只将其上限更新为“无穷大”

就我所知:

UPDATE table
SET timespan = daterange(lower(timespan),upper(infinity)::daterange)
WHERE (upper(timespan) = '2013-12-31'::daterange);

您没有告诉我们您遇到了什么错误,但据我所知,有三个问题:

第一:对
日期范围的两个强制转换是错误的。
daterange
的边界是
date
值。因此,您需要将它们转换为
date
而不是
daterange
,例如

where upper(timespan) = '2013-12-31'::date
第二个问题是
上限(无穷大)
的使用。同样地,
infinity
不是一个范围,只是一个时间点,所以对它使用
upper()
是不起作用的

无穷大
必须用单引号括起来,您可以将其用作关键字

UPDATE the_table
   SET timespan = daterange(lower(timespan),'infinity')
WHERE (upper(timespan) = date '2013-12-31');

我认为将上限设置为
null
也会有同样的效果。不确定
null
infinity
之间是否有细微的差别作为界限之一。

您没有告诉我们您得到了什么错误,但据我所知,有三个问题:

第一:对
日期范围的两个强制转换是错误的。
daterange
的边界是
date
值。因此,您需要将它们转换为
date
而不是
daterange
,例如

where upper(timespan) = '2013-12-31'::date
第二个问题是
上限(无穷大)
的使用。同样地,
infinity
不是一个范围,只是一个时间点,所以对它使用
upper()
是不起作用的

无穷大
必须用单引号括起来,您可以将其用作关键字

UPDATE the_table
   SET timespan = daterange(lower(timespan),'infinity')
WHERE (upper(timespan) = date '2013-12-31');

我认为将上限设置为
null
也会有同样的效果。不确定作为边界之一的
null
infinity
之间是否存在细微差异。

作为范围边界,null和infinity之间存在差异。无穷界小于null
infinity
基本上是最高可能日期值的别名<代码>选择日期“无穷大”
返回
292278994-08-17
。作为范围界限,null和无穷大之间存在差异。无穷界小于null
infinity
基本上是最高可能日期值的别名<代码>选择日期“无限”
返回
292278994-08-17