5

残念ながら、2 つのタイムスタンプを比較する必要があるクエリがあります。PHP の date() 関数から 1 つのタイムスタンプが DB に与えられ、タイムゾーンなしのタイムスタンプとして保存されるため、この日付にミリ秒が追加されることはありません。もう 1 つはタイム ゾーン付きの PG タイムスタンプです。したがって、両方の日付がすでに作成され、テーブルに挿入されています。日付の例を次に示します。

タイムゾーンなしのタイムスタンプ = 2012-09-19 18:13:26

PG のタイム ゾーン付きタイムスタンプ = 2012-09-19 18:13:26.893878-04

私は PG の date::timestamp(0) をキャストすることができます。2012-09-19 18:13:27

だから私の質問は、秒を切り捨てるにはどうすればよいですか?

4

2 に答える 2

5

秒に切り捨てるには、次を使用します。date_trunc('seconds', :timestamp)

例:

select date_trunc('seconds', '2012-09-19 18:13:26.893878-04'::timestamp)
  = '2012-09-19 18:13:26'::timestamp;

これはt(真)をもたらします

于 2012-09-20T02:22:35.923 に答える
3

タイムスタンプが等しいかどうかの比較がうまくいくことはめったにありません。2 つのタイムスタンプが で取得された場合はどうなり2012-09-19 18:13:26.99999999ますか? クロックのジッター、スケジューラーのジッター、実行時間の差などは、1 秒を次の秒に押し上げる可能性があり、多くの場合、1 秒を押しのけます。また、エッジに近い必要はありません。でハックを試すことができます

代わりに狭い範囲と比較してください。2 秒言う:

SET timezone = '+04:00';

SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz 
       BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1' SECOND 
           AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' + INTERVAL '1' SECOND;

PHP タイムスタンプの精度は 1 秒であるため、それより粗いものを使用できるかどうかはわかりません。

PHP がタイムスタンプを取得する場合でも、丸めずに常にタイムスタンプを切り捨てる (切り捨てる) ことが確実にわかっている場合は、括弧の間隔を調整することで、これを大まかに修正できます。たとえば、1 秒の間隔 (PHP から与えられたタイムスタンプの精度をテストできる最も狭い間隔) を試みるには、PHP が常にタイムスタンプを切り捨てると仮定して、次のようにします。

SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz 
       BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1' SECOND 
           AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04';

個人的には、確実に両側に少なくとも 0.1 秒追加します。

SELECT (TIMESTAMP '2012-09-19 18:13:26')::timestamptz 
       BETWEEN TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' - INTERVAL '1.1' SECOND 
           AND TIMESTAMPTZ '2012-09-19 18:13:26.893878-04' + INTERVAL '0.1' SECOND;

等しいかどうかをテストすることを本当に主張する場合は、次を使用します。

regress=# SELECT date_trunc('second', TIMESTAMPTZ '2012-09-19 18:13:26.893878-04');
       date_trunc       
------------------------
 2012-09-19 18:13:26-04
(1 row)

ただし、別々にキャプチャされた 2 つのタイムスタンプが等しいかどうかをテストするのは危険であり、間違っていることに注意してください。

于 2012-09-20T00:42:50.327 に答える