业务的日期参数落库Mysql失败,分析datatime和timestamp的区别

背景:

作者在在实际业务中,对某个功能执行续期操作。

 

 

 

 

 

 

 

分析过程:

1、出现报错的时候,续期其他的权限,依然正常。排除后台服务整体挂掉的情况

2、出现报错的时候,该条记录,无论如何都无法续期了。刷新前端页面也是一样。

3、连续给某条记录续期,会100%出现报错

4、查询后台日志+数据库

 

在续期到一定次数后,会出现报错的情况:

java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

 

 

 

 

 数据库报错的字段,都是2038年报错

 

 

 

根据上述后台日志 猜测是数据库落库字段越界导致的

查询了时间的存储类型 datatime和timestamp的区别:

 

 

 

发现是字段越界了。

建议修改为datatime 类型

 

扩展知识:

DATETIME

     DATETIME 用于表示 年月日 时分秒,是 DATE 和 TIME 的组合,并且记录的年份(见上表)比较长久。如果实际应用中有这样的需求,就可以使用 DATETIME 类型。

 TIMESTAMP

  • TIMESTAMP 用于表示 年月日 时分秒,但是记录的年份(见上表)比较短暂。
  • TIMESTAMP 和时区相关,更能反映当前时间。当插入日期时,会先转换为本地时区后再存放;当查询日期时,会将日期转换为本地时区后再显示。所以不同时区的人看到的同一时间是  不一样的。
  • 表中的第一个 TIMESTAMP 列自动设置为系统时间(CURRENT_TIMESTAMP)。当插入或更新一行,但没有明确给 TIMESTAMP 列赋值,也会自动设置为当前系统时间。如果表中有第二个 TIMESTAMP 列,则默认值设置为0000-00-00 00:00:00。
  • TIMESTAMP 的属性受 Mysql 版本和服务器 SQLMode 的影响较大。

     如果记录的日期需要让不同时区的人使用,最好使用 TIMESTAMP。

 

posted @ 2021-08-18 11:33  快乐开心的大虾  阅读(265)  评论(0)    收藏  举报