La necessità di eseguire questa operazione in SQL di solito indica che si verificano problemi con il modello di dati in cui si memorizzano le date suddivise in campi nel DB anziché come data o campi di data/ora reali oppure si ha un grave errore di escape e SQL injection i problemi. Vedi la spiegazione di seguito.
entrambi delle seguenti risolverà il problema immediato:
CREATE OR REPLACE FUNCTION make_date(year integer, month integer, day integer) AS $$
SELECT year * INTERVAL '1' YEAR + month * INTERVAL '1' MONTH + day * INTERVAL '1' DAY;
$$ LANGUAGE sql STRICT IMMUTABLE;
o
CREATE OR REPLACE FUNCTION make_date(year integer, month integer, day integer) AS $$
SELECT format('%s-%s-%s', year, month, day)::date;
$$ LANGUAGE sql STRICT IMMUTABLE;
ma per favore, continuate a leggere.
Il fatto che si sta chiedendo questo mi fa pensare che probabilmente stai cercando di costruire SQL nell'applicazione in questo modo:
$sql = "SELECT date'" + year + '-' + month + '-' + day + "';";
che è generalmente pericoloso e sbagliato (sebbene probabilmente non siano direttamente sicuri se year
, month
e day
sono tipi di dati interi). Si dovrebbe usare query parametrizzate invece se questo è quello che stai facendo per evitare SQL injection e risparmiare un sacco di seccature con la formattazione di escape e letterale. Vedi http://bobby-tables.com/.
Ecco come ci si ricerca una data utilizzando una dichiarazione con parametri in Python con psycopg2 (dal momento che non è stato specificato la lingua o strumenti):
import datetime
import psycopg2
conn = psycopg2.connect('')
curs = conn.cursor()
curs.execute('SELECT %s;', (datetime.date(2000,10,05),))
print repr(curs.fetchall());
Questo stamperà:
[(datetime.date(2000, 10, 5),)]
cioè un array con una singola data Python al suo interno. Puoi vedere che è stato in un round trip attraverso il database e non hai mai dovuto preoccuparti del formato o della rappresentazione della data di PostgreSQL, dal momento che psycopg2 e PostgreSQL si occupano di ciò quando usi le istruzioni parametrizzate. Vedi this earlier related answer.
C'è una ragione per cui non è possibile utilizzare 2000 || '-' || 01 || '-' || 02? Quelli sarebbero interi, ma producono una stringa. – kainaw
In futuro si prega di menzionare sempre la versione di PostgreSQL. Non penso che i downvotes siano giustificati, ma dovresti davvero spiegare di più - versione Pg, quale problema stai cercando di risolvere, la lingua e la libreria client che stai utilizzando, codice di esempio se possibile, ecc. –