1-01-01 ... 1-12-31
を期待していました ...しかし、PostgreSQLはそれが何を意味するのかをどのように知っているのでしょうか?
入力文字列リテラルは、現在のセッションの設定(デフォルトではpostgressql.conf
の一般設定)に従って解釈されます。 却下されない限り)。特にdatestyle
:
DateStyle
(string
)日付と時刻の値の表示形式、およびあいまいな日付入力値を解釈するためのルールを設定します。歴史的な理由から、この変数には2つの独立したコンポーネントが含まれています。出力フォーマット仕様(
ISO
、Postgres
、SQL
、またはGerman
)および年/月/日の注文の入力/出力仕様(DMY
、MDY
、またはYMD
)。これらは個別に設定することも、一緒に設定することもできます。キーワードEuro
およびEuropean
DMY
の同義語です;キーワードUS
、NonEuro
、およびNonEuropean
MDY
の同義語です 。 セクション8.5を参照してください 詳細については。組み込みのデフォルトはISO, MDY
です。 、ただし、initdbは、選択したlc_time
の動作に対応する設定で構成ファイルを初期化します。 ロケール。
(出力形式は主にlc_time
によって決定されますが 。)
あなたの場合、切断されたタイムスタンプリテラル1-12-31 23:59:59
明らかに次のように解釈されます:
D-MM-YY h24:mi:ss
あなたが望んでいたであろう間:
Y-MM-DD h24:mi:ss
3つのオプション
-
datestyle
を設定します リテラルをあなたと同じように解釈するようにします。多分ISO, YMD
? -
to_timestamp()
を使用する 他の設定に関係なく、明確に定義された方法で文字列リテラルを解釈します。はるかに良い。SELECT to_timestamp('1-12-31 23:59:59', 'Y-MM-DD h24:mi:ss');
-
さらに良いことに、ISO8601形式を使用してください (
YYYY-MM-DD
)すべての日時リテラル。これは明確で、どの設定からも独立しています 。SELECT '2001-12-31 23:59:59'::timestamp;
クエリの書き換え
そもそもクエリに誤りがあります。範囲クエリの処理方法は異なります。いいね:
SELECT d.given_on
FROM documents_document d
WHERE EXTRACT('month' FROM d.given_on) = 1
AND d.given_on >= '2001-01-01 0:0'
AND d.given_on < '2002-01-01 0:0'
ORDER BY d.created_on DESC;
または、もっと簡単です:
SELECT d.given_on
FROM documents_document d
WHERE d.given_on >= '2001-01-01 0:0'
AND d.given_on < '2001-02-01 0:0'
ORDER BY d.created_on DESC;
PostgreSQL9.2以降の範囲タイプが興味深い場合があります。