Parte del problema è che l'espressione SQL standard per gli intervalli cita il numero, ma non le parole chiave. Quindi devi stare attento.
select current_date, current_date + interval '2' day;
--
2012-02-21 2012-02-23 00:00:00
In PostgreSQL, funzionano anche virgolette come "2 giorni" e "2 giorni". Quindi potresti pensare che '2' || ' giorni' sarebbe equivalente, ma non lo è.
select current_date, current_date + interval '2' || ' days';
--
2012-02-21 2012-02-21 00:00:02 days
La soluzione, come ha detto A.H., è lanciare la stringa del risultato come intervallo.
Puoi anche utilizzare una variabile al posto di 2. Questo genera un calendario per il 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 quel cast finale fino ad oggi, perché data + intervallo restituisce un timestamp.