背景:服務數據入庫的時候報錯 com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '2050-04-14 13:43:55' for column 'failure_time' at row 1
鑑於部分入庫時間報錯,首先排除了代碼問題,想到了是不是timestamp時間有範圍限制,於是在數據庫裏也試了試比較大的時間依然報錯:
通過搜索得知:timestamp所能存儲的時間範圍爲:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'。並且受時區影響。
具體原因參考mysql官方文檔:https://dev.mysql.com/doc/refman/8.0/en/datetime.html
The
DATE
type is used for values with a date part but no time part. MySQL retrieves and displaysDATE
values in'
format. The supported range isYYYY-MM-DD
''1000-01-01'
to'9999-12-31'
.The
DATETIME
type is used for values that contain both date and time parts. MySQL retrieves and displaysDATETIME
values in'
format. The supported range isYYYY-MM-DD hh:mm:ss
''1000-01-01 00:00:00'
to'9999-12-31 23:59:59'
.The
TIMESTAMP
data type is used for values that contain both date and time parts.TIMESTAMP
has a range of'1970-01-01 00:00:01'
UTC to'2038-01-19 03:14:07'
UTC.
其他詳細論證文章可參考:https://blog.csdn.net/weter_drop/article/details/89924451
解決方案:將timestamp類型修改爲datatime類型。在我的數據庫中如下:
/*
證書更新表字段修改 支持入庫時間年限增加
*/
-- ----------------------------
-- Table structure for `apply_update`
-- ----------------------------
ALTER TABLE `apply_update`
MODIFY COLUMN `failure_time` datetime NULL DEFAULT NULL COMMENT '證書失效時間' AFTER `effective_time`;
ALTER TABLE `apply_update`
MODIFY COLUMN `effective_time` datetime NULL DEFAULT NULL COMMENT '證書生效時間' AFTER `cert_validity`;