近日在写完项目,在insert数据做测试时,发现了一个小问题。
开发工具中报错如下:
### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1969-12-31 23:59:00' for column 'end_time' at row 1
### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1969-12-31 23:59:00' for column 'end_time' at row 1
; SQL []; Data truncation: Incorrect datetime value: '1969-12-31 23:59:00' for column 'end_time' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1969-12-31 23:59:00' for column 'end_time' at row 1] with root cause
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '1969-12-31 23:59:00' for column 'end_time' at row 1
(篇幅有限,只截取一部分)
在页面中显示报错为:
(篇幅有限,只截取一部分)
原来是日期字段插入的值不支持,但我insert的语句中有两个日期字段,在格式上没有任何问题啊,一个可以插入,一个却为什么会插入不了呢?排除了其他可能的原因后,怀疑可能是这个值的问题,查阅MySQL官方(https://dev.mysql.com/doc/refman/8.0/en/datetime.html)之后,得了MySQL中DATE,DATETIME和TIMESTAMP类型支持范围。原文如下:
The DATE
type is used for values with a date part but no time part. MySQL retrieves and displays DATE
values in 'YYYY-MM-DD'
format. The supported range is '1000-01-01'
to '9999-12-31'
.
The DATETIME
type is used for values that contain both date and time parts. MySQL retrieves and displays DATETIME
values in 'YYYY-MM-DD HH:MM:SS'
format. The supported range is '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.
翻译:
该DATE
类型用于具有日期部分但没有时间部分的值。MySQL DATE
以'YYYY-MM-DD'
格式检索和显示 值 。支持的范围是'1000-01-01'
到 '9999-12-31'
。
该DATETIME
类型用于包含日期和时间部分的值。MySQL DATETIME
以'YYYY-MM-DD HH:MM:SS'
格式检索和显示 值。支持的范围是 '1000-01-01 00:00:00'
到'9999-12-31 23:59:59'
。
该TIMESTAMP
数据类型被用于同时包含日期和时间部分的值。 TIMESTAMP
的'1970-01-01 00:00:01'
UTC到'2038-01-19 03:14:07'
UTC 范围。
(注意:UTC代表时区。从当前时区转成UTC时区需要减去8小时。)
从官方手册中可看出在MySQL中把日期设置成 TIMESTAMP类型,其值的范围为
'1970-01-01 00:00:01'
UTC到'2038-01-19 03:14:07'
UTC ,超出就会报错。
若是使用cmd界面对数据库进行insert操作,TIMESTAMP类型值超出范围,报错如下:
ERROR 1292 (22007): Incorrect datetime value: '1969-12-31 23:59:00' for column 'create_time' at row 1
若使用一些不报错的可视化软件强制对数据库进行TIMESTAMP类型值超出范围的
操作,因为数据库要求月和日值有效,而不仅仅分别在1到12和1到31的范围内。禁用严格模式后,将生成无效日期,转换为 '0000-00-00 00:00:00'
和警告。