MySQL日期格式化教程 13位时间戳转日期类型的解决方案

二面竟然被问到MySQL时间类型datetime、h3int及timestamp的查询效率

问题是:直接使用 datetime 或 timestamp 进行时间范围查询的性能比 h3int 低。

不信:日期和时间戳在所有场景下都有相同的性能。

不要这样做:在需要频繁查询、排序或范围过滤的时间字段上使用日期时间或时间戳。

MySQL日期时间数据类型有哪些

说实话,这四种类型在使用时差别很大。
之前做电商项目的时候,我是用DATETIME来处理订单的,因为客户下单的具体时间点必须精确到秒,不能含糊。
我记得检查过为什么订单出错了。
通过按时间排序,我可以快速找到问题时段。
如果我使用TIMESTAMP,我可能要自己计算时区转换,非常不方便。

有趣的是 TIMESTAMP 的 2 03 8 限制,我的同事去年差点就发现了这个限制。
他们的系统使用 TIMESTAMP 来记录设备重启的次数。
结果到2 03 8 年设备重启记录已满,数据库直接报错。
解决了好久的问题,最后改用BIGINT节省了一秒,问题就完美解决了。
我自己不运行这个。
我记得数据大约是X秒,但我建议你检查一下具体值。

YEAR类型用的不多,但是有场景。
比如我们内部的员工档案表,只需要YEAR来存储出生日期,这样就节省了空间。
然而,最近新项目需要很长时间才能展示,因此需要实时计算。
当时有点混乱,但我最终使用 DATETIME 来存储完整的日期。

TIME类型是最灵活的。
我在之前的物流项目中用得很好。
跟踪卡车的位置时,表中存储的是卡车行驶了多长时间。
例如,“2 5 :00:00”表示已行驶 2 5 小时。
在这种场景下,使用TIME比DATETIME节省大量空间,而且语义更清晰。

归根结底,类型的选择取决于具体的业务。
选择 DATETIME 表示固定时间,选择 TIMESTAMP 表示时区转换,选择 YEAR 表示年份,选择 TIME 表示时间间隔或期间。
需要权衡数字大小和存储效率。
有时,为了查询方便而节省几 KB 是值得的。