2014-07-25 35 views
2

我有一個腳本,必須像任務一樣執行「Google Analytics」。 基本顯示用戶的訪客統計信息。如何處理MySQL中的時區?

我想在請求它的用戶的時區中生成報告。

到目前爲止,我已經寫了代碼如下:

SET time_zone = timezone; 

它做什麼它設置每每個MySQL連接的時區。如果用戶使用timestamp檢索數據,則時間戳將轉換爲連接的時區。我在時間戳中存儲UTC。

所以一切似乎工作。但有些人說這是一種錯誤的做法。由於多個用戶無法使用不同的time_zone設置連接到數據庫。

MySQL doc說:

每個連接的時區。每個連接的客戶端都有自己的時間 區域設置,由session time_zone變量給出。最初, 會話變量需要從全局的time_zone變量, 它的價值,但客戶端可以改變自己的時區,這個說法

但是他們一直堅持認爲你不應該在MySQL的時區做任何事所有。你應該在你的(例如)PHP代碼中完成這一切。 Here對此答案有類似的問題。

但是我怎麼能在PHP代碼中做到這一點?我的意思是我知道如何用PHP中的時區轉換時間,但它不像我檢索單個行。

我對迄今在timestamp領域檢索數千行和一羣人:

SELECT ... 
FROM logs 
WHERE 
user_id = :user_id 
AND timestamp >= CURDATE() 
GROUP BY DATE(timestamp) 

據MySQL正在使用時間戳的索引,因爲我有幾百萬是非常重要的。即使我在時間戳GROUP BY DATE(timestamp)上使用函數,該索引是否也能正常工作?如果不是我能如何完成這個?

那麼我應該怎麼做呢?我會非常感謝一些建議。

+1

來自客戶端的時間戳應已轉換爲gmt。儘管當地時間不是,倫敦電腦和香港電腦的時間戳應該是一樣的。這有助於澄清要做什麼嗎?基本上什麼都沒有。客戶應該做這些草率的工作。 – Octopus

+0

DB上唯一要做的就是定義一個時區(也許是UTC),所有數據都存儲在這裏,就是這樣。在PHP中進行轉換。 – ToBe

回答

0

現在用戶將所有時間戳轉換爲他的tz並使用時間戳(* user)> = CURDATE(* user)。 我想其他的辦法是

convert timestamp(user) to timestamp(server) 

,並使用

timestamp(*server) >= CURDATE(*server) 

例如

dates =(5,6,7) 

(轉換到我的TZ)dates-2 = (3,4,5) (檢查直接與這陣約束)biggerThan3結果=(4,5) 第二條路 (將約束轉換爲ts服務器)biggerThan3 -> biggerThan(3+2)5 (檢查服務器陣列約束)dates =(5,6,7) result=(6,7) 結果可以轉換爲(4,5)