web-dev-qa-db-ja.com

過去1週間に発生した結果をどのように見つけますか?

returned_date列を持つbooksテーブルがあります。過去1週間に返品された日付のあるすべての書籍の結果を確認したいと思います。

何かご意見は?日付計算を試してみましたが、Postgresは私の試みに満足していませんでした。

42
Huuuze

intervalcurrent_dateを使用したい場合:

select * from books where returned_date > current_date - interval '7 days'

これは、過去1週間のデータを返します含む今日。

詳細はこちら Postgresでの日付の操作について。

68
Eric

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設定に依存することに注意してください。

41

どのような数学を試しましたか?

これは動作するはずです

select * from books where current_date - integer '7'

PostgreSQL日付/時刻関数と演算子 から取得

0
mbillard