Часть проблемы заключается в том, что стандартное выражение 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;
Я использую это окончательное приведение к дате, потому что дата + интервал возвращает метку времени.