在PostgreSQL中添加月份到日期中出现语法错误

38

我正在使用Postgres 9.0版本。我想在一个日期上添加一些月份以计算新的日期并更新表格。这里要添加的月份数将为整数变量。我的代码如下:

declare numberofmonths smallint = 5;
update salereg1 set expdate = current_date + interval cast(numberofmonths as text) month;

上述代码在转换时出现语法错误。我不知道如何将numberofmonths变量指定为文本。有人可以帮我吗?我犯了什么错误。


这个:在Postgres中通过添加月份计算日期? 有帮助吗? - Andrew Morton
1
在添加月份时,您应该注意我们日历的一些特殊性。从2013-01-28、2013-01-29、2013-01-30或2013-01-31开始,一个月后应该是哪个日期?默认情况下,Postgres将为这4个日期返回2013-02-28。另外,从2012-02-29开始算12个月呢?2012年是闰年,Postgres将返回2013-02-28。 - Tometzky
4个回答

87

尝试类似以下的内容:

update salereg1 
set expdate = current_date + interval '1 month' * numberofmonths;

我喜欢这个比我的更好。也许我会写成'1 month'::interval * numberofmonths - Roman Pekar
非常感谢,对于那些新使用Postgres的人来说,这非常有帮助。 - winnie damayo

16

像这样的东西:

update salereg1 set
    expdate = current_date + (numberofmonths::text || ' month')::interval;

SQL Fiddle示例


这是一个非常棒的技巧,适用于区间值本身要使用动态文本+1的情况。 - Tim Biegeleisen

5

从Postgres 9.4版本开始,您还可以使用方便的函数make_interval

update salereg1 
  set expdate = current_date + make_interval(months => numberofmonths);

2
理解SQL Server和PostgreSQL之间的类比:

SQL Server: -- 获取到期日期


PostgreSQL:
SELECT DATEADD(day, valid, purchased) FROM licenses;

PostgreSQL: -- 获取过期日期

SELECT purchased + valid * INTERVAL '1 DAY' FROM licenses;

同样地,current_date + number_of_months * INTERVAL '1 MONTH'; 中的 INTERVAL 可以是 '1 MONTH','1 DAY','1 YEAR' 等等。
有关更多信息,请访问此页面:PostgreSQL - DATEADD - Add Interval to Datetime

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