假如我在MySQL数据库中有一个订单表,结构如下:

status pay_method update_time
1 2 1724403637114

其中 update_time 是bigint类型,对应Java/Kotlin代码中的Long类型,用以存储时间戳,用MySQL的bigint而不是timestamp类型,也能避免2038年上限的尴尬问题。

当然,得到一样东西很可能失去另一样东西,那就是“可读性”,我们在查询数据的时候,一眼是看不出来这个 1724403637114 具体是什么时间的。能不能既要又要呢?保证存储格式不变的情况下,查询的时候还能显示成更可读的时间格式。

这时候就可以用MySQL的函数了:FROM_UNIXTIME,它可以在查询的时候帮你格式化时间戳!我们直接看SQL语句:

1
SELECT status, pay_method, FROM_UNIXTIME(update_time / 1000, '%Y-%m-%d %H:%i:%s') AS update_time FROM order;

因为此函数输入参数的单位是秒,所以我们需要除以1000,格式化之后,查询内容就会变成:

status pay_method update_time
1 2 2024-08-23 17:00:37

可读性大大增加,再也不用心算时间戳了!

不过,我个人建议这个函数只用于后台查问题或者做一些数据库简单维护的时候使用,最好不要在生产环境中去格式化时间戳,这样会影响MySQL的查询性能。把原始的bigint时间戳直接返回给调用方,在客户端应用中再去按需转换才是最佳做法,这样同时还可以避免MySQL所在服务器的时区和调用方不一致的问题。