MySQL 时间字段用 int 、 datetime 还是 timestamp?

去年夏天,我接手了一个项目,客户需要一个能够处理跨国时间数据的功能。
在数据库设计阶段,我就面临了一个选择:使用DATETIME还是TIMESTAMP类型来存储时间。
最后我选择了DATETIME。
原因很简单,那天下午,我在查看某个时间戳数据时,发现它在不同时区显示的时间居然不一致。
而且,我担心到了2 03 8 年,那个所谓的“千年虫”问题会在这个项目中出现。
等等,我还记得有一次,我在处理一个遗留项目中,用INT类型存储时间,每次导出数据都需要经过复杂的转换才能看懂。
而DATETIME则直接显示,节省了不少时间。
所以,在考虑操作效率和用户体验后,我最终推荐使用了DATETIME。

mysql datetime、date、time、timestamp区别

这事儿我得给你讲讲,都是我当年踩坑总结出来的。

想当年,我刚开始做项目,搞数据库那会儿,就因为没分清这些类型,吃了大亏。
你说这datetime、date、time、timestamp,听着都像亲戚,其实差着十万八千里。

先说date吧。
这个我用的挺多。
比如,公司年会,我们搞个签到表,只需要记录啥时候来过,日期就行。
我就用date类型。
格式是 yyyy-mm-dd,这个你记住了。
范围也挺广,从1 000年到9 9 9 9 年。
存储也不大,3 个字节。
当年有个活动,签到表搞错了,把1 9 00年当成了2 000年,差点出事。
要是用了date,就不会有这种乌龙。

再说time。
这个我用在记录加班时间上。
比如,晚上加到几点,早上几点走。
只需要时间部分,日期不用管。
格式是 hh:mm:ss。
范围可以很大,能表示超过2 4 小时。
存储也一样,3 个字节。
有个同事,加了一天班,直接用time存了2 5 小时,结果系统直接炸了。
要是用time,就不会出这种问题。

然后是datetime。
这个我用得最多,记录各种事件发生的时间点。
比如,订单创建时间、用户注册时间。
格式是 yyyy-mm-dd hh:mm:ss。
范围是1 000-01 -01 00:00:00到9 9 9 9 -1 2 -3 1 2 3 :5 9 :5 9 存储稍微大点,8 个字节。
当年有个项目,用户注册时间用datetime存,结果有个用户注册时间比系统还早,直接把数据库搞崩溃了。
要是用date,就不会有这种问题。

最后是timestamp。
这个我当年用得不多,但后来发现其实挺有用的。
格式是 yyyymmddhhmmss,显示的时候会变成 yyyy-mm-dd hh:mm:ss。
范围是1 9 7 0-01 -01 00:00:01 UTC到2 03 8 -01 -1 9 03 :1 4 :07 UTC。
存储比datetime小,4 个字节。
关键是,timestamp会根据服务器的时区设置进行转换。
比如,你在美国东部时间注册,服务器在北京时间,时间会自动转换。
这个特性很有用,但也很容易踩坑。
当年有个项目,用户分布在全世界,结果因为时区问题,时间乱套了。
要是用datetime,就不会有这种问题。

总的来说,date适用于只需要存储日期的场景,time适用于只需要存储时间(不关心日期)的场景,datetime适用于需要同时存储日期和时间的场景,且不需要考虑时区转换,timestamp也适用于需要同时存储日期和时间的场景,但需要考虑时区转换,并且适用于记录数据的修改时间。

选择哪种类型,要根据具体的应用场景和需求来决定。
千万别像我当年那样,随便用,最后出大问题。

MySQL date、datetime和timestamp类型的区别

说白了,MySQL里的date、datetime和timestamp区别就三块:存啥、占多大、看时区不。

先说最重要的datetime,它俩精度都到秒,但datetime是8 字节,能存到9 9 9 9 年,适合存精确时间还不用管时区变化——比如你记录用户下单的完整时间。
另外一点是timestamp占小4 字节,但会跟系统时区跑偏,去年我们跑那个跨区项目,直接把timestamp当绝对时间用,数据全乱套,说实话挺坑的。
还有个细节挺关键的,timestamp能存的时间只有到2 03 8 年,用datetime能避开这个雷。

我一开始也以为timestamp更灵活,后来发现不对,它其实是用Unix时间戳算的,直接跟UTC挂钩,所以跨时区用着顺手但本地化场景容易出问题。
等等,还有个事,索引上timestamp更快,因为字节少,但datetime支持范围广,所以选哪个得看你的数据量级——大概3 000量级以内timestamp占优,再往上datetime可能反超。

提醒个坑:别把timestamp当绝对时间用,除非你系统时区永远不变。