将varchar数据类型转换为日期时间数据类型会导致超出范围的值

时间:2011-03-28 23:10:25

标签: sql sql-server service sqlexception

我从C#windows服务运行以下内联SQL:

UPDATE table_name SET 
    status_cd = '2', 
    sdate = CAST('03/28/2011 18:03:40' AS DATETIME), 
    bat_id = '33acff9b-e2b4-410e-baaf-417656e3c255', 
    cnt = 1, 
    attempt_date = CAST('03/28/2011 18:03:40' AS DATETIME) 
WHERE id = '1855'

当我在应用程序内对SQL Server数据库运行时,出现以下错误:

  

System.Data.SqlClient.SqlException:将varchar数据类型转换为日期时间数据类型会导致超出范围的值。   声明已经终止。

但是,如果我从SQL Management Studio中获取SQL并运行它,它将毫无问题地运行。

可能导致此问题的任何想法?

7 个答案:

答案 0 :(得分:63)

根据登录语言解释不明确的日期格式。这工作

set dateformat mdy

select CAST('03/28/2011 18:03:40' AS DATETIME)

这不是

set dateformat dmy

select CAST('03/28/2011 18:03:40' AS DATETIME)

如果使用具有正确数据类型的参数化查询,则可以避免这些问题。您还可以使用unambiguous“未分隔”格式yyyyMMdd hh:mm:ss

答案 1 :(得分:13)

  

但是,如果我从sql管理工作室获取sql并运行它,它将毫无问题地运行。

如果您可以自由,请将服务帐户更改为您自己的登录信息,这将继承您的语言/区域优惠。

问题的真正症结在于:

  

我使用以下内容进行转换 - > date.Value.ToString(“MM / dd / yyyy HH:mm:ss”)

请开始使用参数化查询,以便将来不会遇到这些问题。它也更强大,可预测和最佳实践。

答案 2 :(得分:7)

我认为使用C#和SQL之间的日期的最佳方法当然是使用参数化查询,并始终使用C#上的DateTime对象和它提供的ToString()格式化选项。

在处理SQL Server上的日期之前,最好执行set datetime <format>here you have the set dateformat explanation on MSDN),这样就不会遇到麻烦,例如set datetime ymd。您只需要在每个连接上执行一次,因为它在打开时保留了格式,因此在打开与数据库的连接后立即执行此操作是一种很好的做法。
然后,您可以随时使用'yyyy-MM-dd HH:mm:ss:ffff'格式。

要将DateTime对象传递给参数化查询,可以使用DateTime.ToString('yyyy-MM-dd HH:mm:ss:ffff')

要在C#上解析奇怪的格式化日期,您可以使用DateTime.ParseExact()方法,您可以选择准确指定输入格式:DateTime.ParseExact(<some date string>, 'dd/MM-yyyy',CultureInfo.InvariantCulture)Here you have the DateTime.ParseExact() explanation on MSDN

答案 3 :(得分:1)

这是一个日期格式问题。在爱尔兰,3月28日的标准日期格式为“28-03-2011”,而“03/28/2011”是美国的标准格式(以及其他许多格式)。

答案 4 :(得分:1)

我知道这个解决方案与OP的情况略有不同,但是你可能已经在这里重定向搜索谷歌这个问题的标题,就像我一样,也许你面对的是我遇到了同样的问题。
有时您会收到此错误,因为您的日期时间无效,即您的日期(字符串格式)指向超过该月的天数的那一天! 例如:CONVERT(Datetime, '2015-06-31')导致我这个错误,而我正在从MySql转换一个语句(它没有争论!并且使错误更难以捕获)到SQL Server。

答案 5 :(得分:0)

JAVA8:使用LocalDateTime.now()。toString()

答案 6 :(得分:0)

我在使用SQL时遇到了这个问题,它与MYSQL不同 解决方案采用以下格式: = date('m-d-y h:m:s'); 而不是 = date('y-m-d h:m:s');