私は7月(または07)に生まれたすべての人を選択することになっています。これは機能しませんでした:
select * from people where date_trunc('month',dob)='07';
エラー:タイムゾーンのあるタイムスタンプタイプの入力構文が無効です: "07" LINE 1:... ct * from people where date_trunc('month'、dob)= '07';
正しい方法は何ですか?
私は7月(または07)に生まれたすべての人を選択することになっています。これは機能しませんでした:
select * from people where date_trunc('month',dob)='07';
エラー:タイムゾーンのあるタイムスタンプタイプの入力構文が無効です: "07" LINE 1:... ct * from people where date_trunc('month'、dob)= '07';
正しい方法は何ですか?
to_char()
日付をフォーマットするためのものです。あなたのような条件の場合、extract()
よりシンプルで高速です:
SELECT *
FROM people
WHERE extract(month FROM dob) = 7;
検索したい場合
特定の年月も (YYYY-MM)
...コメントで述べたように、date_trunc()
最初と同じように使用してください。date
文字列ではなくorと比較するだけtimestamp
です。これは意味がありません (エラーメッセージの原因でした)。1970 年 7 月生まれの人を検索するには:
SELECT *
FROM people
WHERE date_trunc('month', dob) = '1970-07-01 0:0'::timestamp;
パフォーマンスが重要な場合は、次のように書き換えます。
SELECT *
FROM people
WHERE dob >= '1970-07-01 0:0'::timestamp
AND dob < '1970-08-01 0:0'::timestamp; -- note the < with the upper limit
このフォームは で単純なインデックスを使用できるためpeople.dob
:
CREATE INDEX people_dob_idx ON people (dob);
...したがって、大きなテーブルを使用した以前のクエリのパフォーマンスが低下します。小さなテーブルではあまり問題ありません。
必要に応じて、関数インデックスを使用して最初のクエリを高速化することもできます。
select * from people where to_char(dob, 'MM') = '09';
生年月日が「dob」と呼ばれるタイムスタンプテーブル列に格納されている場合、9月に生まれたすべての人に提供されます。2番目のパラメーターは、日付形式のパターンです。すべての一般的なパターンをサポートする必要があります。例えば:
select * from people where to_char(dob, 'MON') = 'SEP';
同じことをします。
Postgresのタイムスタンプ形式のパターンについては、こちらをご覧ください。