Parte del problema es que la expresión SQL estándar para intervalos cita el número, pero no las palabras clave. Así que tienes que tener cuidado.
select current_date, current_date + interval '2' day;
--
2012-02-21 2012-02-23 00:00:00
En PostgreSQL, también funcionan las citas como '2 días' y '2 días'. Así que podrías pensar que '2' || 'días' sería equivalente, pero no lo es.
select current_date, current_date + interval '2' || ' days';
--
2012-02-21 2012-02-21 00:00:02 days
La solución, como dijo A.H., es convertir la cadena de resultados como un intervalo.
También puede usar una variable en lugar de 2. Esto genera un calendario para 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;
Uso ese lanzamiento final hasta la fecha, porque fecha + intervalo devuelve una marca de tiempo.