奇怪的SQL错误:将varchar转换为日期时间会导致超出范围的值

时间:2012-04-25 13:28:05

标签: c# sql-server datetime windows-server-2008

在新服务器中安装应用程序后,它会抛出错误:

The conversion of a varchar data type to a datetime data type resulted in an 
out-of-range value.

应用程序在其他服务器上正常运行,所以我对这个问题感到困惑。保存的值是

25/4/2012 1:18:01 PM 

这是一个已经保存到datetime列的DateTime类型,因此我确信数据库和代码本身没有问题。问题可能是严格因为服务器的设置?任何具体原因和解决方案/解决方法?

3 个答案:

答案 0 :(得分:1)

防止问题的一种方法。

如果您对包含日期的Feed的内容有任何影响,则“Day#MonthName 4digityear”是您想要的格式。无论区域设置如何,sql server中的启发式方法都不会对'25APR2012'感到困惑。这是一种更健壮的格式。它将毫无困难地在海洋上旅行。

否则,你必须使用convert(datetime,TheDateString,CorrectFormatNumber)

我认为131可能适合你。

哦,并回应一些评论,如果你可以阻止这些数据采用字符串的形式,你应该。

答案 1 :(得分:1)

您可以为每个连接设置日期时间格式,例如

SET DATEFORMAT dmy

此方法允许您对发送到SQL Server的日期使用日期格式d / m / y,但它取决于连接。如果与SQL Server建立了新连接,或者服务器已停止并重新启动,则日期格式将恢复为m / d / y。

永久设置格式

要在服务器上设置语言,必须使用sp_addlanguage添加语言。 下面的示例设置英国英语的语言,并以DD / MM / YY格式给出日期。该示例也可以应用于其他国家/地区,但您可能需要修改sp_addlanguage的参数。

exec sp_addlanguage'英国','英语',    “一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,    十一月十二月',       “一月,二月,三月,四月,五月,六月,七月,八月,九月,十月,十一月,十二月”,    '周一周二周三周四周五周六周日',    DMY,1    sp_configure'默认语言',1    使用覆盖重新配置

了解更多信息

http://support.microsoft.com/kb/173907

答案 2 :(得分:0)

好的建议,但在我的情况下,我无法通过数千行代码。在安装过程中重新安装sql并设置区域设置是最快且最省时的方法。

在将应用程序中的日期时间字符串保存到数据库中之前解析它是一个给定的。

设置语言和日期格式仅适用于当前查询,而不适用于所做的每个查询。当然,在代码上更新sql查询是浪费时间,imo和我的情况。