我从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并运行它,它将毫无问题地运行。
可能导致此问题的任何想法?
答案 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');