如何将动态(基于列)天数添加到NOW?
SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date"
FROM a;
a.number_of_days
整数在哪里?
Answers:
我通常将数字乘以interval '1 day'
或类似的数字,例如:
select now() + interval '1 day' * a.number_of_days from a;
我知道这已经是一岁了,但是如果您需要使用一列来指定实际间隔(例如,“天”,“月”),那么值得知道的是,您还可以将字符串CAST转换为间隔,给出:
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;
select *, num * case unit when 'W' then '1 week'::interval when 'D' then '1 day'::interval when 'H' then '1 hour'::interval end from (values(1,'W'),(2,'D'),(3,'H')) x(num, unit)
SELECT now() + CAST(a.number_of_days||' DAYS' AS Interval) as "The Future Date" FROM a;
要创建基于列值的间隔,建议在表中添加两列。例如,列“ period_value” :: INT4和列“ period_name” :: VARCHAR。列“ period_name”可以存储以下值:
+ -------------- + ------------- + | period_value | period_name | + -------------- + ------------- + | 2 | 分钟| + -------------- + ------------- +
现在您可以编写:
SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;
interval
已经提供的功能。创建一个类型的单列interval
将比此技巧更好。
采用 make_interval()
SELECT NOW() + make_interval(days => a.number_of_days) AS "The Future Date"
FROM a;
但总的来说,最好使用定义为的列interval
,然后在其中存储值时可以使用任何所需的单位。
days => a.number_of_days
似乎是Postgres的关键字语法以及make_interval仅具有用于参数years
,months
,weeks
,days
,hours
,mins
和secs
。这意味着它不适用于所有单位interval '1 millisecond' * msTime
,但在大多数情况下仍是一个不错的选择。
secs
接受double value
secs => 0.001
如果我们有带有间隔字符串值的字段,例如“ 41 years 11 mons 4 days”,并想将其转换为出生日期,请使用以下查询:
UPDATE "february14" set dob = date '2014/02/01' - (patient_age::INTERVAL)
dob是将'41 years 11 mons 4 days'转换 为 '1972/10/14'的日期字段,例如,
Patient_age是具有'41 years 11 mons 4 days'这样的字符串的varchar字段。
这是将年龄转换回出生日期的查询
SELECT now() - INTERVAL '41 years 10 mons 10 days';