2012-09-20 113 views
4

我有一個查詢,不幸的是必須比較2個時間戳。一個時間戳從PHP date()函數給DB,作爲沒有時區的時間戳存儲,所以沒有毫秒添加到這個日期。另一個是帶時區的PG時間戳。因此,已經創建並插入到表中兩個日期,這裏是日期的例子:PostgreSQL輪迴時間戳秒爲一個postgres預創建日期與毫秒

時間戳沒有時區= 2012-09-19十八點13分26秒

PG的時間戳和時區= 2012-09-19 18:13:26.893878-04

我可以施放PG日期:: timestamp(0),它使我關閉,但如預期的那樣,日期向上舍入; 2012-09-19 18:13:27

所以我的問題是我怎樣才能得到秒倒圓角?

回答

1

比較相等的時間戳很難很好地工作。如果兩個時間戳記在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) 

但要注意它的危險和錯誤的測試兩個獨立封頂爲平等設定時間戳。

+0

是的,但與其他條件一起,可能會給我的對手我希望這會起作用,我可能不得不放棄這些價值觀。感謝您的答案和示例代碼 – Anthony

4

向下舍入到第二,使用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(真)