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();
Parm
のselectedtimeParm
の評価に問題があります-正しく解決しません。
編集者注:日付型period
のtime
、time frame
、date
、およびtimestamp
という用語の不正確な使用は変更しませんでした。私の答えでそれを議論します。
どうしたの:
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
(問題はコマンドライン端末にはほとんど関係ない)だけをタグ付けしたという事実は、何日も誰も答えなかった理由を説明するのに役立つかもしれません。通常、ここから数分です。私はあなたの質問を理解するのに苦労し、それを数回読む必要がありました。
データ型date
、interval
、time
、およびtimestamp
を理解する必要があります-タイムゾーンの有無にかかわらず。 マニュアルの「日付/時刻タイプ」 の章を読むことから始めます。
エラーメッセージもかなりの距離を過ぎていたでしょう。