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

Posted

技术标签:

【中文标题】如何在 postgresql 日期时间中添加天数【英文标题】:How to add number of days in postgresql datetime 【发布时间】:2012-06-10 05:08:28 【问题描述】:

我有一个下表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))

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

【问题讨论】:

【参考方案1】:

这将为您提供最后期限:

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: LOCALTIMESTAMPtimestamp without time zone @Salil:也无所谓,timestamptimestamptz 的结果都是一样的,只要数据指的是同一时间点。添加一天对两者的效果相同。 我的 create_at 保存在 UTC 时间(无时区)中,而 LOCALTIMESTAMP 和 CURRENT_TIMESTAMP 给了我 +5.30 的时间,因此问题仍然没有得到解决 @Salil:然后使用localtimestamp at time zone 'UTC'重新计算本地时间戳到UTC【参考方案2】:

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

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 Date/Time Functions

【讨论】:

created_at + '1 day' 也对我有用。【参考方案3】:

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

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

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

选择 current_date - 180 ---它会在 180 天之前给出日期

【讨论】:

以上是关于如何在 postgresql 日期时间中添加天数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 postgresql/netezza 从日期时间中减去天数或月数

如何计算日历表中只有值为 1 的 2 列日期之间的天数 - postgreSQL?

PostgreSQL:通过随机天数更改日期

如何在 TypeScript 中从日期中减去天数

在 Netezza 中为日期添加天数

如何计算两个(年-月-日)中间的间隔天数