如何向NOW添加动态(基于列)的天数?
SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date"
FROM a;
a.number_of_days
是一个整数?
答案 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;