2012-02-21 14 views
9

W PostgreSQL Chcę Concat się current_timestamp z interval następująco:PostgreSQL jak Concat wartość odstępu '2 dni'

select current_timestamp + interval 2||' days' 

Ale kiedy zrobić, pojawia się błąd:

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

Ale jeśli to zrobię to w ten sposób, że działa poprawnie:

select current_timestamp + interval '2 days' 

Dlaczego jedną pracę, ale nie inne?

Nawiązując do następnej stronie http://www.postgresql.org/docs/8.0/static/functions-datetime.html

+0

Czy ** naprawdę ** używa 8.0? (twój link do manul używa tej wersji) –

Odpowiedz

18

Częścią problemu jest to, że standardowe wyrażenia SQL dla interwałów podaje liczbę, ale nie słowa kluczowe. Musisz więc być ostrożny.

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

Działa również w PostgreSQL, podobnie jak "2 dni" i "2 dni". Więc możesz pomyśleć, że "2" || "dni" byłyby równoważne, ale tak nie jest.

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

Rozwiązaniem, jak powiedział A.H., jest rzucanie łańcucha wyniku jako interwału.

Można również użyć zmiennej zamiast 2. Niniejsza generuje kalendarz 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; 

używam tego ostatecznej obsady do tej pory, ponieważ data + przedział zwraca znacznik czasu.

16

Spróbuj tej składni:

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

lub nawet tego:

select current_timestamp + 2 * interval '1 day';