向MSSQL表插入datetime时转换失败的问题及相关咨询
问题分析与解决方案
一、转换失败的原因
你使用的CONVERT(datetime, '2023-02-14 01:41:24', 113)语句中,第三个参数113对应的是英式日期格式(dd mon yyyy hh:mm:ss:mmm(24h)),比如正确输入应为'14 Feb 2023 01:41:24'。但你传入的字符串是yyyy-mm-dd hh:mm:ss格式,与113指定的格式不匹配,因此触发了转换错误。
二、能否为datetime列设置固定格式避免转换?
不行。SQL Server中的datetime类型是以二进制形式存储的,本身没有格式,所谓的“格式”只是数据显示时的表现形式。要避免转换错误,更可靠的方式是:
- 使用SQL Server能自动识别的ISO 8601标准格式,比如
'2023-02-14T01:41:24',这种格式不受服务器语言/日期设置影响,无需转换可直接插入:insert into dbo.Table(Id, StartTime, StopTime) values('1', '2023-02-14T01:41:24', null) - 采用参数化查询,让数据库驱动自动处理类型转换,彻底规避字符串格式问题。
三、能否指定服务器默认使用yyyy-mm-dd hh:mm:ss格式?
可以通过修改服务器配置实现:
- 会话级临时生效:执行
SET DATEFORMAT ymd;,当前会话内的日期字符串会按年-月-日的规则解析。 - 服务器级永久生效:修改SQL Server的默认语言为支持
ymd格式的语言(比如英语(美国)),或通过数据库配置工具调整全局日期格式。
不过更推荐使用ISO 8601格式,因为它兼容性最强,不会因服务器设置变更引发问题。
内容的提问来源于stack exchange,提问作者Wojciech Szabowicz
相关产品推荐
相关产品推荐

