如何使用MYSQL TIMESTAMP欄位進行時間加減運算
阿新 • • 發佈:2019-02-15
在資料分析過程中,想當然地對TIMESTAMP欄位進行運算,導致結果謬之千里,計算公式如下:
-- create_time與week_time的宣告都是TIMESTAMP(), 要求精確到分鐘 --
SELECT (sa.create_time - sa.week_time)/(1000 * 60)
from alarm_sla_1 sa
當然正確的解法是利用timestampdiff函式,如下:
SELECT timestampdiff(minute, sa.create_time, sa.week_time)
from alarm_sla_1 sa
但有意思的問題在於,MYSQL明明支援減法操作,為何操作的結果又大相徑庭?類似的問題還有,TIMESTAMP欄位的時間精度是什麼?
從MYSQL的官方例項中可以看到(請見後續的參考文件),TIMESTAMP欄位的小數部分確定了秒的經度,3位小數精確到毫秒,6位小數精確到微秒,如下:
宣告方式 | 小數長度 | 精度 |
---|---|---|
TIMESTAMP(3) | 3 | 毫秒 |
TIMESTAMP(6) | 6 | 微秒 |
按照上面的推論,那麼預設的宣告TIMESTAMP應該精確到秒,那麼應該相減的結果應該得到秒,測試語句如下:
SELECT sa.week_time - sa.create_time, timestampdiff(second, sa.create_time, sa.week_time)
from alarm_sla_1 sa
但最後的結果見下表:
相減結果 | 函式結果 |
---|---|
1000012 | 86412 |
顯然,並不存在相關性,差異何止裡計?
後來繼續進行了指定經度的操作運算,結論依舊如此。
DATETIME 與 TIMESTAMP的區別
特性 | DATETIME | TIMESTAMP |
---|---|---|
時間範圍 | 1000-01-01 00:00:00到9999-12-31 23:59:59 | 1970-01-01 00:00:01到2038-01-09 03:14:07 |
儲存空間 | 8+3(秒的精度) | 4+3(秒的精度) |
格式轉換 | 不支援 | 支援UTC |
多時區支援 | 不支援,固定時區 | 不支援 |
建立索引 | 不能 | 能 |
查詢後快取結果 | 否 | 是 |
結論
MYSQL中TIMESTAMP欄位直接進行相減操作,可能得到難以理解的結果,請慎用。