Azure Spark SQL中如何将含毫秒的时间戳四舍五入到秒?
在Azure Spark SQL中将时间戳四舍五入到秒的解决方案
原代码问题分析
你之前使用的代码无法实现四舍五入,核心原因是unix_timestamp(timestamp("date_col"))会直接截断时间戳的毫秒部分,仅返回秒级整数时间戳——毫秒信息已经丢失,后续的除法操作自然无法完成四舍五入逻辑。
可行解决方案
方法一:结合秒数与毫秒数的精确计算
通过提取秒部分和毫秒部分,合并后执行四舍五入,再转换为目标格式:
SELECT from_unixtime( round(unix_timestamp(date_col) + date_part('millisecond', date_col)/1000), 'yyyy-MM-dd''T''HH:mm:ss' ) AS rounded_timestamp FROM your_table;
代码说明:
unix_timestamp(date_col):提取时间戳的秒级整数部分date_part('millisecond', date_col):提取时间戳的毫秒值(0-999)- 两者相加得到带毫秒的精确秒数(如
19.645),通过round()完成四舍五入 from_unixtime(...)将处理后的秒数转换为指定格式,''T''用于转义输出中的T分隔符
方法二:基于毫秒级时间戳的直接计算
将时间戳转为毫秒级数值,通过加500毫秒后取整实现四舍五入,再转回目标格式:
SELECT from_unixtime( round(cast(date_col AS BIGINT)/1000), 'yyyy-MM-dd''T''HH:mm:ss' ) AS rounded_timestamp FROM your_table;
代码说明:
cast(date_col AS BIGINT):把timestamp类型转为毫秒级时间戳数值(如2023-06-16T00:00:19.645会转为1686873619645)- 除以1000得到带毫秒的秒数,
round()完成四舍五入 - 最终通过
from_unixtime转换为目标格式
效果验证
对于输入2023-06-16T00:00:19.645,两种方法都会输出2023-06-16T00:00:20;若输入为2023-06-16T00:00:19.499,则输出2023-06-16T00:00:19,完全符合四舍五入预期。
内容的提问来源于stack exchange,提问作者HelpSeeker
相关产品推荐
相关产品推荐

