动态(基于列)间隔

时间:2011-03-10 22:36:03

标签: postgresql intervals

如何向NOW添加动态(基于列)的天数?

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

a.number_of_days是一个整数?

7 个答案:

答案 0 :(得分:131)

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

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

答案 1 :(得分:22)

我知道这已经有一年了,但是如果你需要使用一个列来指定实际的间隔(例如'days','months',那么值得知道你也可以将你的字符串CAST到一个Interval,给予:

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;

答案 2 :(得分:7)

我更喜欢这种方式。我觉得它很简单干净。 在postgre中,您需要interval+运算符与timestamp

一起使用
select (3||' seconds')::interval;

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

你可以用秒,分......天,月...... 并且您可以将数字替换为列。

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

答案 3 :(得分:4)

要根据列值创建间隔,我建议在表格中添加两列。例如,列“period_value”:: INT4和列“period_name”:: VARCHAR。 列“period_name”可以存储以下值:

  • 微秒
  • 毫秒
  • 第二
  • 分钟
  • 小时
  • 季度
  • 十年
  • 世纪
  • 千年
+--------------+-------------+
| period_value | period_name |
+--------------+-------------+
| 2            | minute      |
+--------------+-------------+

现在你可以写:

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

答案 4 :(得分:2)

使用make_interval()

SELECT NOW() + make_interval(days => a.number_of_days) AS "The Future Date" 
FROM a;

但是,通常最好使用定义为interval的列,然后在其中存储值时可以使用所需的任何单位。

答案 5 :(得分:0)

如果我们有带有间隔字符串值的字段,例如'41 years 11 mons 4 days'并想将其转换为出生日期,请使用此查询:

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

dob 是将 '41年11月4日'转换为'1972/10/14'的日期字段,例如
patient_age 是varchar字段,其字符串类似于'41 years 11 mons 4 days'

这是将年龄转换回出生日期的查询

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

答案 6 :(得分:0)

基于列ID进行更新是为我创建一些随机测试数据的有用方法。

update study_histories set last_seen_at = now() - interval '3 minutes' * id;