pandasql中时间差计算结果自动舍入为天不显示时分秒问题咨询
问题现象
计算两个timestamp类型字段的时间差时,结果自动舍入到天级别,小时、分钟、秒的差值信息完全丢失,无法通过简单乘以24/60这类单位换算方式修复,后续还需要基于该时间差值开展其他乘法运算,已尝试多种方案均无效。
原查询代码如下:
query = ''' WITH lagging_column as (SELECT ACCOUNT, FULL_TABLE_NAME, UPDATE_TIME as first_time, LAG(UPDATE_TIME) OVER(PARTITION BY ACCOUNT, FULL_TABLE_NAME ORDER BY UPDATE_TIME) as previous_time FROM mont_df ORDER BY ACCOUNT, FULL_TABLE_NAME, first_time) Select ACCOUNT, FULL_TABLE_NAME, first_time, previous_time, cast (first_time as timestamp) - cast(previous_time as timestamp) as update_diff from lagging_column where first_time != previous_time ''' mysql(query)
根本原因
MySQL里直接用减号计算两个时间类型字段的差值时,会先把时间转换成YYYYMMDDHHMMSS格式的纯数字再做减法,不会返回精确的时间间隔类型,最终只会保留整数天的差值,时分秒部分的精度会直接丢失,这种计算逻辑本身的缺陷没法通过后续乘系数换算弥补。
修复方案
不要直接用减号计算时间差,改用TIMESTAMPDIFF函数按你需要的最小精度返回差值,后续做乘法运算也不会有精度问题:
- 要秒级精度的原始差值,直接返回秒数即可:
TIMESTAMPDIFF(SECOND, previous_time, first_time) as update_diff
- 要保留时分秒占比的天级差值,基于秒级结果换算即可:
TIMESTAMPDIFF(SECOND, previous_time, first_time) / 86400 as update_diff_day
- 要返回
HH:MM:SS格式的时间间隔,可以配合SEC_TO_TIME函数使用:
SEC_TO_TIME(TIMESTAMPDIFF(SECOND, previous_time, first_time)) as update_diff_interval
注意:原查询里对first_time和previous_time重复做timestamp类型转换是多余的,字段本身已经是timestamp类型,这步转换不会解决精度问题,直接替换掉原来的减法计算部分即可。
内容的提问来源于stack exchange,提问作者imtherealmikey1
相关产品推荐
相关产品推荐

