SQL Server字符串转datetime时毫秒精度异常变化问题
问题现象
- 执行转换SQL:
select CONVERT(datetime, '31-05-2022 04:00:00.105', 105),尝试将指定格式字符串转为datetime类型 - 输入字符串毫秒部分为105,实际返回结果为
2022-05-31 04:00:00.107,毫秒值偏移为107,不符合预期
产生原因
该现象是SQL Server原生datetime类型的固有设计限制,与CONVERT函数逻辑无关:
datetime类型的时间分量存储精度为1/300秒(约3.33毫秒),所有传入的毫秒值都会被自动舍入到最接近的0、3、7毫秒刻度,无法精确存储任意毫秒值- 传入的105毫秒,正好处于
datetime支持的两个相邻时间刻度之间:31个时钟滴答对应103.33毫秒(显示为103),32个时钟滴答对应106.67毫秒(显示为107),105毫秒距离106.67毫秒更近,因此被舍入为107毫秒
解决方法
需要保留精确毫秒精度时,改用精度更高的datetime2类型即可。datetime2最高支持100纳秒级精度,不会出现毫秒自动舍入的问题,对应转换语句如下:
select CONVERT(datetime2, '31-05-2022 04:00:00.105', 105)
原语句使用的样式码105(对应dd-mm-yyyy的日期格式规则)对datetime2类型同样生效,日期部分解析逻辑不变,执行后可得到毫秒值精确为105的正确结果。
内容的提问来源于stack exchange,提问作者I_G
相关产品推荐
相关产品推荐

