106

我有一张下表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(No. of days)

类似于以下的东西。

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))

但由于某种原因,它不起作用。

4

3 回答 3

175

这将为您提供最后期限:

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
于 2012-06-06T07:36:52.270 回答
26

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

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   

Postgres 日期/时间函数

于 2018-06-13T06:13:35.037 回答
2

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

选择日期('08/30/2021')+ 180 ---它将给出下一个 180 天的日期

选择 current_date + 180 ---它将给出下一个 180 天的日期

选择 current_date - 180 ---它将在 180 天之前给出

于 2021-08-30T11:02:41.707 回答