MySQL中的日期时间类型与格式化方式总结

呃,我真的又爱又恨这些 MySQL 日期和时间类型。
以前做数据库的时候,经常遇到这样的坑。

记得有一次,2 01 5 年的时候,我在一个项目中使用了DATE类型来存储生日信息。
结果一个客户说他的生日是1 9 00年,我一看,天哪,这个DATE类型不支持1 9 00年之前的日期,直接给我返回了一个零值,0000-00-00。
客户看到后觉得不科学,赶紧给我打电话。
场面十分尴尬。

还有一次,2 01 7 年,一位同事使用DATETIME类型记录订单的时间,却不小心输入了负数时间,比如-1 1 :5 0:5 4 这样就好了,系统一直报错,因为TIME类型不支持负值。
我连忙给他解释,他顿时明白了。

我们来谈谈 YEAR 类型。
2 01 8 年,有一个项目需要存储年份,所以我使用了YEAR类型。
结果客户输入6 9 ,系统直接认为是2 06 9 年,这是一个很大的错误。

对于 TIMESTAMP 来说,情况更为极端。
有一次,2 01 9 年,我更新了一条记录,系统自动将时间戳更新为当前时间。
当顾客看到时,这是不科学的。
明明是昨天更新的,怎么又变成今天了?我查了一下,发现TIMESTAMP类型有这个功能。
当创建或修改记录时,它会自动刷新到当前时间。

说到格式化和转换函数,以前使用DATE_FORMAT()函数时,经常忘记括号里的格式化参数,结果就是格式错误。
有一次,2 01 6 年的时候,我把当前时间格式化了,直接写成SELECT DATE_FORMAT(SYSDATE(), '%Y-%m-%d%H:%i:%s')。
结果返回的时间格式不正确。
事实证明,缺少一个冒号。

总之,这些日期和时间类型各有各的陷阱,所以使用时要小心。
例如,如果您需要记录年份,则应先选择“YEAR”。
如果您需要精确到秒的时间戳并且需要自动更新,请使用 TIMESTAMP。
如果需要存储完整的日期和时间,请使用 DATETIME。
如果您只需要存储日期或时间,请使用 DATE 或 TIME。
这是我多年来遇到的陷阱,也是我从经验中吸取的教训。

MySQL中如何设置默认时间mysql默认时间设置

直接使用CURRENT_TIMESTAMP。

例如,创建表时 sql 创建表测试( id 整数 创建于日期时间默认 CURRENT_TIMESTAMP。
);
输入数据时; created_at 是在当前时间自动填写的。

不确定时区问题,生产环境使用UTC会更稳定。

给自己计时。

MySQL datetime timestamp 以及如何自动更新,如何实现范围查询

说白了,日期时间戳自动更新和区域查询的核心区别在于时区和存储区域。
它包含在细节中,但不要让术语让您感到困惑。

自动更新时间戳字段是 MySQL 的标准功能。
比如我们去年运行的电商系统中,user表使用了last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
每次用户更新记录时,系统都会自动将字段填充到第二级。
这个6 位精度就是UTC时间戳,行话里叫“时间戳”。
它实际上是从1 9 7 0年到2 03 8 年的秒数,比日期和时间的1 000-9 9 9 9 年要短得多。
请注意,时间戳会自动检测时区,因此跨时区操作时要小心。

虽然日期时间也可以通过 ON UPDATE 自动更新,但默认情况下不会发送。
去年有一个项目就因为这个差点崩溃——我们使用了 event_time DATETIME ON UPDATE CURRENT_TIMESTAMP 但发现默认值为 NULL,每次更新触发器都会报错。
因此,如果要自动更新datetime,则必须显式添加DEFAULT CURRENT_TIMESTAMP。
另外,datetime 不会改变时区,这是一个障碍。
例如,如果你节省在美国的时间,直接为中国用户检查,你可能会错。

一开始我以为时间戳比较先进,后来发现很多欧洲公司都用datetime。
Timestamp 在跨时区的场景中非常好用,但如果你只是想记录准确的时间而不考虑时区,那么 datetime 更容易。
还有一个关键细节:最大时间戳是2 03 8 ,现在已经运行了5 年,所以新项目使用TIMESTAMP(6 )已经成为一种趋势。

提醒:使用Java+MyBatis检查时间戳时,不要使用>='2 02 3 -01 -01 ' AND <='2 02 3 -1 2 -3 1 ',这会触发数据库时区转换。
直接使用 WHERE timestamp_column BETWEEN '2 02 3 -01 -01 ' AND '2 02 3 -1 2 -3 1 ' 更稳定。
许多人不注意这一点。

我认为值得尝试使用UTC存储的timestamp(6 ),但是datetime的灵活性在某些场景下非常好。