1. 程式人生 > >如何使用MYSQL TIMESTAMP欄位進行時間加減運算

如何使用MYSQL TIMESTAMP欄位進行時間加減運算

在資料分析過程中,想當然地對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欄位直接進行相減操作,可能得到難以理解的結果,請慎用。

參考文件