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……

posted @ 2022-07-15 17:19  友善的穿山甲兄弟  阅读(2418)  评论(0)    收藏  举报
返顶
回部
返中
回部
返底
回部