PostgreSQL как посчитать значение интервала '2 дня' - PullRequest
11 голосов
/ 21 февраля 2012

В PostgreSQL я хочу объединить current_timestamp с interval следующим образом:

select current_timestamp + interval 2||' days'

Но при этом я получаю сообщение об ошибке:

[Err] ERROR:  syntax error at or near "2"
LINE 1: select current_timestamp + interval 2||' days'

Ноесли я делаю это так, это работает правильно:

select current_timestamp + interval '2 days'

Почему работает один, а не другой?

Со ссылкой на следующую страницу http://www.postgresql.org/docs/8.0/static/functions-datetime.html

Ответы [ 2 ]

26 голосов
/ 21 февраля 2012

Часть проблемы заключается в том, что стандартное выражение SQL для интервалов указывает число, а не ключевые слова. Поэтому вы должны быть осторожны.

select current_date, current_date + interval '2' day;
--
2012-02-21   2012-02-23 00:00:00

В PostgreSQL также работает цитирование типа «2 дня» и «2 дня». Так что вы можете подумать, что «2» || «дни» были бы эквивалентны, но это не так.

select current_date, current_date + interval '2' || ' days';
--
2012-02-21   2012-02-21 00:00:02 days

Решение, как сказал А.Х., состоит в том, чтобы привести результирующую строку как интервал.

Вы также можете использовать переменную вместо 2. Это создаст календарь на 2012 год.

-- 0 to 365 is 366 days; 2012 is a leap year.
select ('2012-01-01'::date + (n || ' days')::interval)::date calendar_date
from generate_series(0, 365) n;

Я использую это окончательное приведение к дате, потому что дата + интервал возвращает метку времени.

21 голосов
/ 21 февраля 2012

Пожалуйста, попробуйте этот синтаксис:

select current_timestamp + ( 2 || ' days')::interval;

или даже этот:

select current_timestamp + 2 * interval '1 day';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...