比較相等的時間戳很難很好地工作。如果兩個時間戳記在2012-09-19 18:13:26.99999999
?時鐘抖動,調度器抖動,執行時間差等可能而且往往會推動下一秒。它不一定非要靠近邊緣纔會發生。你可以嘗試黑客與
相比,一個狹窄的範圍,而不是;說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)
但要注意它的危險和錯誤的測試兩個獨立封頂爲平等設定時間戳。
是的,但與其他條件一起,可能會給我的對手我希望這會起作用,我可能不得不放棄這些價值觀。感謝您的答案和示例代碼 – Anthony