SQL Server 使用CONVERT或CAST函数将字符串转换为DATETIME类型毫秒值不精确问题
错误场景:
使用CONVERT函数将时间字符串转为时间
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.111');
时间字符串的毫秒值111却给我转成了110,少了1毫秒。

使用CAST函数将时间字符串转为时间
SELECT CAST('2022-01-01 08:00:00.111' AS DATETIME);
仍然少了1毫秒

错误原因:
DATETIME类型的时间精度为1000分之3秒,也就是说会有3毫秒的误差。
官方文档对DATETIME类型的精度描述为
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/datetime-transact-sql?view=sql-server-ver16
舍入到 .000、.003 或 .007 秒三个增量,意思是毫秒值的最后一会只会是0、3、7。
我们测试一下。
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.110');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.111');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.112');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.113');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.114');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.115');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.116');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.117');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.118');
SELECT CONVERT( DATETIME, '2022-01-01 08:00:00.119');
转换出来的时间最后一位毫秒值确实只会有0、3、7三位。

解决方案:
使用DATETIME2数据类型,DATETIME2数据类型的精度为10000000分之1秒
测试一下:
SELECT CONVERT( DATETIME2, '2022-01-01 08:00:00.111');
毫秒值没有再丢失精度了

优化一下我们不需要那么高的精度,精确到毫秒就行了,毫秒是3位。
SELECT CONVERT( DATETIME2(3), '2022-01-01 08:00:00.111');

大功告成,垃圾SQL Server……

浙公网安备 33010602011771号