如何在PostgreSQL中添加天数到日期时间

135
我有以下的表格projects
id title        created_at               claim_window
1  Project One  2012-05-08 13:50:09.924  5
2  Project Two  2012-06-01 13:50:09.924  10

A) 我想通过计算找到截止日期,公式为 deadline = created_at + claim_window,其中 claim_window 是天数。类似以下的形式:
id title        created_at               claim_window  deadline
1  Project One  2012-05-08 13:50:09.924  5             2012-05-13 13:50:09.924
2  Project Two  2012-06-01 13:50:09.924  10            2012-06-11 13:50:09.924

B) 我还想找到截止日期已过的项目。
id title        created_at               claim_window  deadline
1  Project One  2012-05-08 13:50:09.924  5             2012-05-13 13:50:09.924

我尝试了类似以下的方法,但是没有成功。
SELECT * FROM "projects" 
WHERE (DATE_PART('day', now()- created_at) >= (claim_window+1))
3个回答

208
这将为您提供截止日期:
select id,  
       title,
       created_at + interval '1' day * claim_window as deadline
from projects

或者可以使用函数make_interval:

select id,  
       title,
       created_at + make_interval(days => claim_window) as deadline
from projects

要获取所有截止日期已过的项目,请使用以下命令:
select *
from (
  select id, 
         created_at + interval '1' day * claim_window as deadline
  from projects
) t
where localtimestamp at time zone 'UTC' > deadline

但是还有一个问题出现了,我的created_at数据类型为timestamp without time zone,而current_timestamp的数据类型为timestamp with time zone,因此我无法得到正确的答案。 - Salil
@Salil:LOCALTIMESTAMP 是一个没有时区的时间戳。 - user330315
2
@Salil:这并不重要,无论是使用timestamp还是timestamptz,结果都是一样的,只要数据指向的是同一时刻。在两者上加一天的效果也是相同的。 - Erwin Brandstetter
我的create_at被保存在UTC时间(无时区)中,而LOCALTIMESTAMP和CURRENT_TIMESTAMP给出的时间是+5.30,因此问题仍未解决。 - Salil
1
@Salil:然后使用localtimestamp at time zone 'UTC'重新计算本地时间戳为UTC。 - user330315
我会将该查询重写为以下形式:with t as ( select id , created_at + interval '1' day * claim_window as deadline from projects ) select * from t where localtimestamp at time zone 'UTC' > deadline - PhilHibbs

33

对于我来说,我必须将整个区间放在单引号中,而不仅仅是区间的值。

select id,  
   title,
   created_at + interval '1 day' * claim_window as deadline from projects   

而不是

select id,  
   title,
   created_at + interval '1' day * claim_window as deadline from projects   

PostgreSQL日期/时间函数


1
created_at + '1 day' 对我也起作用了。 - VishnuVS

8

您可以使用以下代码添加或减去任何日期字段

select date('08/30/2021') + 180  ---it will give next 180 days date

select current_date + 180  ---it will give next 180 days date

select current_date - 180  ---it will give before 180 days date

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