2017-03-03 65 views
1

我知道這是常見問題,並已在此論壇上得到解答,但我的問題僅針對某種情況。 我存儲傳感器數據在數據庫表我應該使用時間戳還是日期時間傳感器數據

CREATE TABLE `sensordata` (
    `userID` varchar(45) NOT NULL DEFAULT '', 
    `instrumentID` varchar(10) NOT NULL DEFAULT '', 
    `utcDateTime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `localDateTime` datetime DEFAULT NULL, 
    `data` varchar(200) DEFAULT NULL, 
    PRIMARY KEY (`userID`,`instrumentID`,`utcDateTime`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

localDateTime列是多餘的,所以我想擺脫它,但我必須跟蹤的本地時間也因爲我們允許用戶更改的時區傳感器,這就是爲什麼我保持記錄數據的本地時間。我也想將utcDateTime的數據類型更改爲timestamp,以便我可以在SELECT查詢中執行時間轉換。例如,

If a sensor is recording in Sydney, one day the user changes its timezone to UTC, how will I know which data is for what time (if I use the current timezone of the sensor). 

我應該堅持這個模式,還是應該創建另一個表來跟蹤時區變化並根據它來解析日期? 請諮詢,如果有更好的解決方案。 謝謝

+0

如果已經UTC保存,又有什麼區別爲「本地時間」 - 你是指傳感器本地還是本地存儲它的服務器?我想你可以保存時區(沒有真正需要的日期)。向用戶顯示數據將是UTC到他們選擇的時區的轉換。 –

+0

問題很明顯,我在談論傳感器的當地時間。 –

回答

2

我會在傳感器讀數時使用DATETIME存儲UTC + 0時間以及localTimeOffset(以分鐘爲單位)。爲什麼?

沒有簡單的邏輯如何抵消隨着時間的推移而變化 - 它可能會隨着時間的推移而不同,不同的國家也會有不同的DST變化。一些國家在其時區內進行夏令時調整,一些國家(我認爲澳大利亞就是其中之一)改變了時區。

通過使用utcDatetime和localTimeOffset,您可以在任何情況下重現事件的確切時間,包括傳感器時區的更改,並可讓您將事件時間轉換爲用戶的時區時間。

附註:您可以選擇存儲localTimeOffset以分鐘爲存在具有像UTC偏移國+ 05:45(尼泊爾)

+0

是的,多數民衆贊成我認爲,但我實際上是試圖減少表的大小,因爲表是64M以上的行大,越來越多,所以尋找更好的解決方案 –

+1

你總是可以考慮保持時間爲整數 - 它是4B vs 8B –

+0

那就是好點(Y) –

1

我的兩個美分是使用「servertimestamp」和「localtimestamp」,所以你可以看到哪個時間戳是哪個。在它旁邊,我會製作一個「eventlog」來查看哪個用戶何時更改了他/她的配置。