33

我有以下从 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 数据类型转换为 datetime 数据类型导致值超出范围。该语句已终止。

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

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

4

8 回答 8

65

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

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)

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

于 2011-03-28T23:14:03.253 回答
14

但是,如果我拿一段 sql 并从 sql management studio 运行它,它将毫无问题地运行。

如果您可以随意,将服务帐户更改为您自己的登录名,这将继承您的语言/地区偏好。

问题的真正症结在于:

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

请开始使用参数化查询,这样您以后就不会遇到这些问题。它也是更强大、更可预测和最佳实践。

于 2011-03-28T23:35:49.027 回答
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() 解释

于 2013-07-04T14:29:26.847 回答
1

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

于 2011-03-28T23:16:14.613 回答
1

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

于 2016-08-31T23:29:45.983 回答
0

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

于 2018-05-28T10:52:09.063 回答
0

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

于 2019-09-26T10:09:58.213 回答
0

您可以使用下一个函数来初始化您的 DateTime 变量:DATETIMEFROMPARTS(年、月、日、小时、分钟、秒、毫秒)

于 2021-10-27T12:42:16.000 回答