タイムスタンプが等しいかどうかの比較がうまくいくことはめったにありません。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 つのタイムスタンプが等しいかどうかをテストするのは危険であり、間違っていることに注意してください。