2017-08-09 63 views
1

我使用一個表:的MySQL獲得劃時代的時間

CREATE TABLE tv (
    datetime datetime NOT NULL, 
    value int(4), 
    metric varchar(25), 
    PRIMARY KEY (datetime) 
); 

我的系統是在CET,所以我得到這個從選擇:

select * from tv; 
+---------------------+-------+----------+ 
| datetime   | value | metric | 
+---------------------+-------+----------+ 
| 2017-08-09 14:17:27 |  0 | TV power | 
| 2017-08-09 14:20:04 |  0 | TV power | 
| 2017-08-09 14:40:04 |  0 | TV power | 
| 2017-08-09 14:45:03 |  0 | TV power | 

當我嘗試繪製它(在grafana ),我用:

SELECT 
    UNIX_TIMESTAMP(datetime) as time_sec, 
    value, 
    metric 
FROM tv 
ORDER BY datetime 

它工作正常,只是它寫入所有與未來2小時多。所以我想這是因爲UNIX_TIMESTAMP認爲日期時間是UTC並且查看系統值,因爲它是CET,它在轉換爲紀元或類似的東西之前正在做+02:00。

我得到這個也:

SELECT @@global.time_zone; 
+--------------------+ 
| @@global.time_zone | 
+--------------------+ 
| SYSTEM    | 
+--------------------+ 
1 row in set (0.00 sec) 

這意味着它使用系統時區是CET。

如何讓我的UNIX_TIMESTAMP正確轉換爲CET?

謝謝。

+0

我認爲你可以找到下面的鏈接你的答案: https://stackoverflow.com/questions/930900/how-do-i-set-the-time-zone-of-mysql –

+0

我想你可以找到你在這裏回答:[鏈接](https://stackoverflow.com/questions/930900/how-do-i-set-the-time-zone-of-mysql) –

回答

0

這裏是什麼documentation不得不說的UNIX_TIMESTAMP

如果UNIX_TIMESTAMP()被調用的日期參數,它返回自「1970-01-01 00自變量秒的值: 00:00'UTC。

從我的理解中,MySQL正在改變輸入時間戳UTC時間,做計算,然後返回偏移仍處於UTC時間。解決此問題的一個選項是在撥打UNIX_TIMESTAMP之前將時間戳從「UTC」時間轉換爲「CET」時間。我在這裏使用了引號,因爲你的時間戳已經在期望的CET時區,但是我們必須通過反擊它自己的努力來巧妙地將MySQL轉化爲UTC。

東西沿着這些路線應該工作:

SELECT 
    UNIX_TIMESTAMP(CONVERT_TZ(datetime, 'UTC', 'CET')) AS time_sec, 
    value, 
    metric 
FROM tv 
ORDER BY datetime 

再次,我們正在將您的時間戳從UTC到CET時間,以抵消UNIX_TIMESTAMP()將做的是相反的。

如果以上對CONVERT_TZ()的調用不適合您,您可能需要花一些時間來配置MySQL時區表。下面是一個SO問題,這將讓你開始:

Database returned an invalid value in QuerySet.dates()

作爲最後的評論,我想你最好的長期解決方案是隻存儲您的時間戳以UTC時間。然後,您只需要轉換傳入和傳出日期,但不需要內部MySQL計算。以UTC時間存儲所有時間戳信息是一種常見的數據庫操作。