动态(基于列)间隔

exp*_*des 53 postgresql intervals

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

SELECT NOW() + INTERVAL a.number_of_days "DAYS" AS "The Future Date" 
FROM a;
Run Code Online (Sandbox Code Playgroud)

a.number_of_days整数在哪里?

ara*_*nid 150

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

select now() + interval '1 day' * a.number_of_days from a;
Run Code Online (Sandbox Code Playgroud)

  • 7年后,这仍然是最好的解决方案。惊人的。 (11认同)
  • 好戏,不知道这是可能的. (5认同)

Pau*_*l S 24

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

SELECT now()+ CAST(the_duration||' '||the_interval AS Interval)
Run Code Online (Sandbox Code Playgroud)

所以最初的问题将成为:

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


Sün*_*iÚr 9

我更喜欢这种方式。我认为它非常简单和干净。在postgre中,您需要interval+operator与timestamp

select (3||' seconds')::interval;

select now()+ (10||' seconds')::interval,now();
Run Code Online (Sandbox Code Playgroud)

您可以在其中使用秒,分钟...天,月...,也可以将数字替换为您的列。

select now()+ (column_name||' seconds')::interval,now()
from your_table;
Run Code Online (Sandbox Code Playgroud)


小智 7

使用make_interval()

SELECT NOW() + make_interval(days => a.number_of_days) AS "The Future Date" 
FROM a;
Run Code Online (Sandbox Code Playgroud)

但一般来说,使用定义为 的列可能是一个更好的主意interval,然后您可以在其中存储值时使用任何您想要的单位。


小智 6

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

  • 微秒
  • 毫秒
  • 第二
  • 分钟
  • 小时
  • 星期
  • 四分之一
  • 十年
  • 世纪
  • 千年
+--------------+-------------+
| 周期值 | 期间名称 |
+--------------+-------------+
| 2 | 分钟|
+--------------+-------------+

现在你可以写:

SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;
Run Code Online (Sandbox Code Playgroud)