Динамический (на основе столбца) интервал - PullRequest
51 голосов
/ 11 марта 2011

Как добавить динамическое (на основе столбцов) количество дней к СЕЙЧАС?

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

Где a.number_of_days - целое число?

Ответы [ 5 ]

132 голосов
/ 11 марта 2011

Я обычно умножаю число на interval '1 day' или подобное, например ::10000

select now() + interval '1 day' * a.number_of_days from a;
23 голосов
/ 10 апреля 2012

Я знаю, что это год, но если вам нужно использовать столбец для указания фактического интервала (например, «дни», «месяцы»), то стоит знать, что вы также можете ЗАСТАВИТЬ свою строку в интервал, дает:

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;
7 голосов
/ 05 октября 2017

Я предпочитаю этот способ.Я думаю, что это довольно легко и чисто.В Postgre вам нужно interval, чтобы использовать + оператор с timestamp

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

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

, где вы можете использовать секунды, минуты ... дни, месяцы ... и вы можете заменить цифры настолбец.

select now()+ (column_name||' seconds')::interval,now()
from your_table;
4 голосов
/ 14 июля 2016

Для создания интервалов, основанных на значениях столбцов, я рекомендую добавить два столбца в вашу таблицу.Например, столбец «period_value» :: INT4 и столбец «period_name» :: VARCHAR.Столбец «имя_ периода» может хранить следующие значения:

  • микросекунда
  • миллисекунды
  • секунда
  • минута
  • час
  • день
  • неделя
  • месяц
  • квартал
  • год
  • декада
  • век
  • тысячелетия
+--------------+-------------+
| period_value | period_name |
+--------------+-------------+
| 2            | minute      |
+--------------+-------------+

Теперь вы можете написать:

SELECT NOW() - (period_value::TEXT || ' ' || period_name::TEXT)::INTERVAL FROM table;
0 голосов
/ 09 октября 2014

Если у нас есть поле со значением строки интервала, например «41 год 11 мес. 4 дня», и мы хотим преобразовать его в дату рождения, используйте этот запрос:

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

dob - поле даты для преобразования '41 года 11 мес 4 дня' в '1972/10/14' , например
Patient_age - это поле типа varchar со строкой типа «41 год 11 месяцев 4 дня»

А это запрос на преобразование возраста в дату рождения

SELECT now() - INTERVAL '41 years 10 mons 10 days';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...