如何将MySQL datetime(6)转换为Unix纪元以来的总微秒数值?
把MySQL datetime(6)转成Unix纪元以来的总微秒数
嘿,这个需求我之前做日志系统的时候刚好碰到过,其实不用自己手动计算年月日时分秒的微秒总和,MySQL自带的函数就能轻松搞定!下面给你两种靠谱的方法,还会提醒你容易踩的时区坑:
方法1:用UNIX_TIMESTAMP结合微秒提取
UNIX_TIMESTAMP()函数会返回指定时间到Unix纪元(1970-01-01 00:00:00 UTC)的秒数(带小数,包含微秒部分),我们只需要把它乘以1000000转成微秒数就行:
SELECT CAST(UNIX_TIMESTAMP(your_datetime_column) * 1000000 AS UNSIGNED) AS total_microseconds FROM your_table;
如果担心浮点数乘法的精度问题,也可以拆分计算:先拿整数秒数乘1e6,再加上时间里的微秒部分:
SELECT (UNIX_TIMESTAMP(your_datetime_column) * 1000000) + EXTRACT(MICROSECOND FROM your_datetime_column) AS total_microseconds FROM your_table;
方法2:用TIMESTAMPDIFF直接计算差值
这个方法更直观,直接计算目标时间和Unix纪元起点的微秒差:
SELECT TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00.000000', your_datetime_column) AS total_microseconds FROM your_table;
重要提醒:时区问题!
Unix纪元的时间是基于UTC的,如果你的MySQL服务器/会话时区不是UTC,上面的结果会有偏差(比如东八区的时间会比实际UTC的Unix微秒数少8小时的量)。所以一定要先把目标时间转成UTC再计算:
修正后的方法1:
SELECT CAST(UNIX_TIMESTAMP(CONVERT_TZ(your_datetime_column, @@session.time_zone, '+00:00')) * 1000000 AS UNSIGNED) AS total_microseconds FROM your_table;
修正后的方法2:
SELECT TIMESTAMPDIFF(MICROSECOND, '1970-01-01 00:00:00.000000', CONVERT_TZ(your_datetime_column, @@session.time_zone, '+00:00')) AS total_microseconds FROM your_table;
两种方法都能得到你要的包含所有时间单位的总微秒数,选哪种看你习惯就行,我个人更偏好TIMESTAMPDIFF,逻辑更清晰不容易出错~
内容的提问来源于stack exchange,提问作者ds390s
相关产品推荐
相关产品推荐

