returned_date
列を持つbooks
テーブルがあります。過去1週間に返品された日付のあるすべての書籍の結果を確認したいと思います。
何かご意見は?日付計算を試してみましたが、Postgresは私の試みに満足していませんでした。
interval
とcurrent_date
を使用したい場合:
select * from books where returned_date > current_date - interval '7 days'
これは、過去1週間のデータを返します含む今日。
詳細はこちら Postgresでの日付の操作について。
returned_date
が実際にデータ型date
であると仮定すると、これはより簡単で、速く、正確です:
SELECT * FROM books WHERE returned_date > CURRENT_DATE - 7
now()::date
は、標準SQL CURRENT_DATE
のPostgres実装です。両方ともPostgreSQLではまったく同じです。
CURRENT_DATE - 7
が機能するのは、/-からinteger
値(=日)を減算/加算できる date
であるためです。 7
のような引用符で囲まれていない数値は、デフォルトでinteger
に設定される数値リテラルですが、数字とオプションの先行符号のみが含まれているため、明示的なキャストは必要ありません。
データ型 timestamp
またはtimestamptz
では、@ [Ericが示すように、interval
を加算/減算する必要があります。 date
でも同じことができますが、結果はtimestamp
であり、date
にキャストバックするか、timestamp
で作業を続ける必要があります。示されているようにdate
に固執することは、最も簡単で最速の方法です。ただし、通常、パフォーマンスの違いはわずかです。
計算はreturned_date
の実際のデータ型から独立しており、演算子の右側の結果の型はどちらの方法にも一致するように強制されます(キャストが登録されていない場合はエラーが発生します)。
「先週」の場合:
> current_date - 7
または>= current_date - 6
にします。今日を除外するそれをBETWEEN current_date - 7 AND current_date - 1
または同様の)にします。他の回答が示唆するように>= current_date - 7
は、最後の_(7日間ではなく8日間の行を返しますそして、厳密に言えば間違っています。
今日を除く日曜日で終わる最後の完全な暦週を取得するには:BETWEEN date_trunc('week', now())::date - 7 AND date_trunc('week', now())::date - 1
「日」と「週」の正確な定義は、常に現在のtimezone
設定に依存することに注意してください。
どのような数学を試しましたか?
これは動作するはずです
select * from books where current_date - integer '7'