通常、SQLでこれを行う必要があるということは、実際の日付またはタイムスタンプフィールドとしてではなく、DB内のフィールドに分割された日付を格納しているデータモデルに問題があるか、深刻なエスケープとSQLインジェクションの問題があることを意味します。以下の説明を参照してください。
次のいずれかにより、当面の問題が解決します。
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;
また
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;
しかし、読んでください。
あなたがこれを求めているという事実は、あなたがおそらく次のようにあなたのアプリケーションでSQLを構築しようとしていると私に思わせます:
$sql = "SELECT date'" + year + '-' + month + '-' + day + "';";
これは一般的に危険で間違っていますyear
(ただし、ifで直接安全ではない可能性がmonth
ありday
、整数データ型です)。これがSQLインジェクションを回避し、エスケープとリテラル形式で多くの手間を省くために行っていることである場合は、代わりにパラメーター化されたクエリを使用する必要があります。http://bobby-tables.com/を参照してください。
Pythonでpsycopg2を使用してパラメーター化されたステートメントを使用して日付を照会する方法は次のとおりです(言語またはツールを指定しなかったため)。
import datetime
import psycopg2
conn = psycopg2.connect('')
curs = conn.cursor()
curs.execute('SELECT %s;', ( datetime.date(2000,10,05), ))
print repr(curs.fetchall());
これは印刷されます:
[(datetime.date(2000, 10, 5),)]
つまり、Pythonの日付が1つ含まれている配列です。パラメータ化されたステートメントを使用すると、psycopg2とPostgreSQLが自動的に処理するため、データベースを往復しており、PostgreSQLの日付形式や表現について心配する必要がないことがわかります。この以前の関連する回答を参照してください。