0

私は7月(または07)に生まれたすべての人を選択することになっています。これは機能しませんでした:

select * from people where date_trunc('month',dob)='07';

エラー:タイムゾーンのあるタイムスタンプタイプの入力構文が無効です: "07" LINE 1:... ct * from people where date_trunc('month'、dob)= '07';

正しい方法は何ですか?

4

2 に答える 2

4

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);

...したがって、大きなテーブルを使用した以前のクエリのパフォーマンスが低下します。小さなテーブルではあまり問題ありません。

必要に応じて、関数インデックスを使用して最初のクエリを高速化することもできます。

于 2012-09-29T02:02:13.990 に答える
3
select * from people where to_char(dob, 'MM') = '09';

生年月日が「dob」と呼ばれるタイムスタンプテーブル列に格納されている場合、9月に生まれたすべての人に提供されます。2番目のパラメーターは、日付形式のパターンです。すべての一般的なパターンをサポートする必要があります。例えば:

select * from people where to_char(dob, 'MON') = 'SEP'; 

同じことをします。

Postgresのタイムスタンプ形式のパターンについては、こちらをご覧ください。

于 2012-09-21T07:26:12.403 に答える