.Net Core 2.0应用程序在SQL查询中使用SUBSTRING表达式时崩溃

时间:2018-02-26 09:46:39

标签: c# sql-server substring core .net-core-2.0

我有一个程序在数据库中的两个表之间移动数据。为此,我使用的是SQL查询和System.Data.SqlClient包。

突然,此查询在执行时抛出错误。 SQLCommand.ExecuteNonQuery投掷:

  

从字符转换日期和/或时间时转换失败   字符串。

我已将转换为:

 AND DATEDIFF(dd,GETDATE(),SUBSTRING(a.date, 1, 10))<14

其中a.date的日期时间为varchar。查询是一个INSERT-SELECT查询,如果我只运行SELECT部分​​,它可以工作。更奇怪的是,无论是否有数据,这个查询在SSMS中运行都非常好。

最近有没有其他人见过这个案子?

1 个答案:

答案 0 :(得分:1)

  

其中a.date是日期时间为varchar。

好吧,这是你的主要问题。如果要存储日期/时间:在数据库中使用适当的存储类型。您可以选择范围广泛,例如datesmalldatetimedatetimedatetime2 - 并且:SQL Server将知道如何正确理解和使用该数据

最终问题是SUBSTRING(a.date, 1, 10)没有给出SQL Server通过隐式字符串转换操作将其理解为日期的结果。这种方法是:效率低下,b:脆弱(特别是在文化之间),因此你根本就不应该这样做。如果您妥善存储数据:所有问题都将消失。

然而!您还可以使用CONVERT告诉SQL Server将字符串解释为日期/时间,明确告诉它您期望的格式(作为数字代码),以便它有机会

如果您的a.date(和子字符串)不是支持的格式之一:放弃所有希望。

顺便说一句;通过计算范围一次的开始日期/结束日期并仅与比较运算符进行比较,可以更有效地完成DATEDIFF(dd,GETDATE(),SUBSTRING(a.date, 1, 10))<14GETDATE()每行不会更改,因此“从现在起14天”不会每行更改。这将使您的查询更有效率,特别是与正确的日期/时间格式相结合 - 它变为:

a.date <= @end -- or < @end, or > @end, or >= @end

可以使用索引。