dynamic(基于列)的时间间隔

如何为NOW添加dynamic(基于列)天数?

SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date" FROM a; 

a.number_of_days是一个整数?

我通常乘以interval '1 day'或类似的数字,例如:

 select now() + interval '1 day' * a.number_of_days from a; 

我知道这已经一年了,但是如果你需要使用一个列来指定实际的时间间隔(例如'days','months',那么值得知道的是你也可以把你的string转换为一个间隔,给出:

 SELECT now()+ CAST(the_duration||' '||the_interval AS Interval) 

所以原来的问题会变成:

 SELECT now() + CAST(a.number_of_days||" DAYS" AS Interval) as "The Future Date" FROM a; 

要创build基于列值的区间,我build议在表格中添加两列。 例如,列“period_value”:: INT4和列“period_name”:: VARCHAR。 列“period_name”可以存储以下值:

  • 微秒
  • 毫秒
  • 第二
  • 分钟
  • 小时
  • 25美分硬币
  • 世纪
  • 千年
 + -------------- + ------------- +
 |  period_value |  period_name |
 + -------------- + ------------- +
 |  2 | 分钟|
 + -------------- + ------------- +

现在你可以写:

 SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table; 

如果我们有间隔string值的字段,如“41年11个月4天”,并且想将其转换为出生date,则使用此查询:

 UPDATE "february14" set dob = date '2014/02/01' - (patient_age::INTERVAL) 

例如,dob是将“ 41年11周岁4天”转换为“1972/10/14”的date字段
patient_age是varchar字段,像“41年11周4天”

这是查询将年龄转换回出生date

 SELECT now() - INTERVAL '41 years 10 mons 10 days'; 

我更喜欢这种方式。 我觉得它很简单,干净。 在Postgre你需要interval使用+运算符

 select (3||' seconds')::interval; select now()+ (10||' seconds')::interval,now(); 

在那里你可以使用秒,分钟…天,月…,你可以将数字replace到您的列。

 select now()+ (column_name||' seconds')::interval,now() from your_table;