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

ama*_*eur 32 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'
Run Code Online (Sandbox Code Playgroud)

当我从应用程序内对SQL Server数据库运行时,我收到以下错误:

System.Data.SqlClient.SqlException:将varchar数据类型转换为datetime数据类型会导致超出范围的值.该语句已终止.

但是,如果我从SQL Management Studio中获取SQL并运行它,它将运行没有问题.

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

Mar*_*ith 64

根据登录语言解释不明确的日期格式.这有效

set dateformat mdy

select CAST('03/28/2011 18:03:40' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

事实并非如此

set dateformat dmy

select CAST('03/28/2011 18:03:40' AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,这可能是原因.解决方法是使用明确的日期格式,例如年 - 月 - 日:''2011-03-28 18:03:40'` (3认同)
  • @Martin - 感谢登录用户建议,就是这样. (2认同)

Ric*_*iwi 13

但是,如果我从sql管理工作室获取sql并运行它,它将运行没有问题.

如果您可以自由,请将服务帐户更改为您自己的登录名,这将继承您的语言/区域权限.

这个问题的真正症结在于:

我使用以下转换 - > date.Value.ToString("MM/dd/yyyy HH:mm:ss")

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

  • 这是用户帐号!!! 应用程序运行的帐户有一个默认语言设置为英国英语,但当我自己登录到sql server man studio时,我的帐户默认为英语! (3认同)
  • +1参数化查询使这更加简单! (2认同)

Ivá*_*inz 7

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

您最好在SQL Server上使用日期之前执行set datetime <format>(这里有MSDN上的set dateformat说明),这样您就不会遇到麻烦,例如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).在这里,你有MSDN上的DateTime.ParseExact()解释)