MSSQL中Varchar转Datetime超出范围报错,不同环境表现异常求助
问题分析与解决建议
你遇到的这个错误,核心原因是SQL Server实例的日期格式/语言设置差异导致字符串转datetime时失败,具体来说:
为什么会报错?
你的查询里用了'14/05/2018 00:00:00'这种日/月/年格式的字符串,但当前运行查询的SQL Server实例默认的日期解析规则是月/日/年(比如美式英语设置),这时候它会把14当成月份,而月份最大是12,自然就触发了"varchar转datetime超出范围"的错误。
而你的SQLExpress克隆库能正常运行,是因为那个实例的语言/日期格式设置是支持日/月/年的(比如英式英语、中文等区域设置),所以解析14/05/2018时会正确识别为2018年5月14日。
可能的具体差异点
- 服务器层面的语言设置:两个实例的默认语言不同,比如生产实例是
us_english,而Express实例是British或Chinese。 - 会话层面的日期格式设置:可能你在Express里运行过
SET DATEFORMAT dmy;之类的语句,或者会话默认格式不同。 - 数据库的兼容级别或区域设置:虽然概率较低,但部分数据库级别的设置也可能影响日期解析。
解决办法(推荐按优先级来)
- 使用无歧义的日期字符串格式:这是最稳妥的方式,不管实例设置如何都能正确解析,比如:
- ISO 8601格式:
'2018-05-14T00:00:00' - 未分隔的数字格式:
'20180514'(日期部分)
修改后的查询可以写成:
Select Time from Flights where Time <= DATEADD(day,3,'2018-05-14T00:00:00') AND Time >= getdate() - ISO 8601格式:
- 显式指定日期格式:在查询开头加上日期格式设置语句,强制SQL Server按日/月/年解析:
SET DATEFORMAT dmy; Select Time from Flights where Time <= DATEADD(day,3,'14/05/2018 00:00:00') AND Time >= getdate() - 修改实例默认语言/日期格式:如果是长期需求,可以修改SQL Server实例的默认语言,但这个操作需要管理员权限,且会影响所有会话,需谨慎操作。
内容的提问来源于stack exchange,提问作者user1238784
相关产品推荐
相关产品推荐

