SQL Server中含三位以上小数的字符串转datetime失败,求设置类解决方案
问题解答
核心结论
没有系统级设置能让SQL Server的datetime类型直接接受秒部分超过3位小数的时间字符串,这是datetime类型本身的精度限制导致的——datetime仅支持3位毫秒精度(约0.00333秒的粒度),无法识别更多小数位的时间格式。
可行替代方案
不需要临时表的情况下,有两种便捷的解决方式:
1. 插入时自动截断/转换多余小数位
利用SQL Server的类型转换逻辑,先将高精度时间字符串转为支持更多小数位的类型(如datetime2),再隐式或显式转为datetime,系统会自动截断多余的小数位:
DECLARE @sample TABLE ( [Id] [UNIQUEIDENTIFIER] NOT NULL, [AccountId] [UNIQUEIDENTIFIER] NOT NULL, [CreatedById] [UNIQUEIDENTIFIER] NOT NULL, [CreatedAt] [DATETIME] NOT NULL, [StartTime] [DATETIME] NULL, [EndTime] [DATETIME] NULL, [ProcessorTimeUsed] [INT] NOT NULL, [FileName] [NVARCHAR](255) NOT NULL, [PlanProgress] [NVARCHAR](MAX) NOT NULL, [Succeeded] [BIT] NULL ); INSERT INTO @sample ( Id, AccountId, CreatedById, CreatedAt, StartTime, EndTime, ProcessorTimeUsed, FileName, PlanProgress, Succeeded ) VALUES ( '269912c1-9197-4602-9914-7dd273f183b8', '8ee8eead-61fb-4962-b411-887f97157904', '17f0e8ef-19c0-450b-ac5d-b1f10156ad6e', CAST('2025-03-11 12:07:32.897475' AS DATETIME), CAST('2025-03-11 12:07:32.907540' AS DATETIME), CAST('2025-03-11 12:18:05.006104' AS DATETIME), 102, '0083cce1-f30d-4ab7-9a68-8409ccc0f372.db', '', 1);
也可以显式指定先转datetime2再转datetime,逻辑更清晰:
CAST(CAST('2025-03-11 12:07:32.897475' AS DATETIME2(6)) AS DATETIME)
2. 修改字段类型为datetime2
如果业务允许,直接将表中的CreatedAt、StartTime、EndTime字段类型改为datetime2(6)(支持最高6位小数精度),这样插入带6位小数的时间字符串时无需任何转换,直接兼容:
ALTER TABLE YourTableName ALTER COLUMN CreatedAt DATETIME2(6) NOT NULL; ALTER TABLE YourTableName ALTER COLUMN StartTime DATETIME2(6) NULL; ALTER TABLE YourTableName ALTER COLUMN EndTime DATETIME2(6) NULL;
补充说明
datetime类型的精度是SQL Server的底层类型定义,不存在任何系统配置项可以扩展其小数位支持,因此必须通过上述转换或字段类型变更的方式解决问题。
内容的提问来源于stack exchange,提问作者Cetin Basoz
相关产品推荐
相关产品推荐

