31

ドキュメントでは、文字列から日付を作成する方法しか見つかりませんでしたDATE '2000-01-02'。これは完全に混乱し、迷惑です。代わりに必要なのは、3つのパラメーターを受け取る関数なのでmake_date(2000, 1, 2)、文字列の代わりに整数を使用して、(文字列ではなく)日付を返すことができます。PostgreSQLにはそのような組み込み関数がありますか?

私がこれを求めている理由は、文字列ではないものに文字列を使用するのが嫌いなためです。日付は文字列ではありません。彼らは日付です。

私が使用しているクライアントライブラリは、Haskell用のHDBC-PostgreSQLです。PostgreSQL9.2.2を使用しています。

4

4 に答える 4

83

PostgreSQL 9.4以降には、実際にはmake_date(year int, month int, day int)日付を作成する関数があります。

http://www.postgresql.org/docs/9.5/static/functions-datetime.html

于 2016-02-03T18:35:00.477 に答える
18

通常、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の日付形式や表現について心配する必要がないことがわかります。この以前の関連する回答を参照してください。

于 2013-03-10T01:45:52.573 に答える
8

他に試す価値のあるものはto_date()関数です。これは上記のバインディングに似ており、ユーザー定義関数を作成する必要はありません。

http://www.postgresql.org/docs/current/static/functions-formatting.html

私はそれをこの形で使用します:

to_Date(month::varchar ||' '|| year::varchar, 'mm YYYY')
于 2014-05-18T15:10:33.137 に答える
0

date(concat())を使用できます

select date(concat(2000::varchar, '-01-01'))
于 2022-02-01T14:13:20.767 に答える