web-dev-qa-db-ja.com

2つのタイムスタンプ間のレコードの選択

SQL transactコマンドを使用したUnixスクリプトをPostgreSQLコマンドに変換しています。

フィールドlast_update_time(xtime)を持つレコードを持つテーブルがあり、選択した期間内に更新されたテーブル内のすべてのレコードを選択したい。

現在の時刻は05/01/2012 10:00:00で、選択された時刻は04/01/2012 23:55:00です。これらの日付の間に更新されたテーブルからすべてのレコードを選択するにはどうすればよいですか。 Unixスクリプトでpsqlコマンドを発行する前に2回を秒に変換し、2つの期間の間隔を秒単位で計算しました。

私は次のようなものを考えました

SELECT A,B,C FROM table
WHERE xtime BETWEEN now() - interval '$selectedtimeParm(in secs)' AND now();

ParmselectedtimeParmの評価に問題があります-正しく解決しません。

編集者注:日付型periodtimetime framedate、およびtimestampという用語の不正確な使用は変更しませんでした。私の答えでそれを議論します。

18
Sharon

どうしたの:

SELECT a,b,c
FROM   table
WHERE  xtime BETWEEN '2012-04-01 23:55:00'::timestamp
                 AND now()::timestamp;

秒のカウントをintervalとして操作したい場合:

...
WHERE  xtime BETWEEN now()::timestamp - (interval '1s') * $selectedtimeParm
                 AND now()::timestamp;

標準のISO 8601日付形式YYYY-MM-DD h24:mi:ssこれは、ロケールまたは DateStyle 設定で明確です。

また、BETWEEN構造の最初の値は小さい値でなければならないことに注意してください。どちらの値が小さいかわからない場合は、 BETWEEN SYMMETRIC 代わりに。

あなたの質問では、日時タイプtimestampを「日付」、「時間」、および「期間」と呼びます。タイトルでは「時間枠」という用語を使用しましたが、これを「タイムスタンプ」に変更しました。これらの用語はすべて間違っています。それらを自由に交換すると、質問がさらに理解しにくくなります。

それに、そしてあなたが質問psql(問題はコマンドライン端末にはほとんど関係ない)だけをタグ付けしたという事実は、何日も誰も答えなかった理由を説明するのに役立つかもしれません。通常、ここから数分です。私はあなたの質問を理解するのに苦労し、それを数回読む必要がありました。

データ型dateintervaltime、およびtimestampを理解する必要があります-タイムゾーンの有無にかかわらず。 マニュアルの「日付/時刻タイプ」 の章を読むことから始めます。

エラーメッセージもかなりの距離を過ぎていたでしょう。

38