我有一个程序在数据库中的两个表之间移动数据。为此,我使用的是SQL查询和System.Data.SqlClient
包。
突然,此查询在执行时抛出错误。
SQLCommand.ExecuteNonQuery
投掷:
从字符转换日期和/或时间时转换失败 字符串。
我已将转换为:
AND DATEDIFF(dd,GETDATE(),SUBSTRING(a.date, 1, 10))<14
其中a.date
的日期时间为varchar。查询是一个INSERT-SELECT查询,如果我只运行SELECT部分,它可以工作。更奇怪的是,无论是否有数据,这个查询在SSMS中运行都非常好。
最近有没有其他人见过这个案子?
答案 0 :(得分:1)
好吧,这是你的主要问题。如果要存储日期/时间:在数据库中使用适当的存储类型。您可以选择范围广泛,例如其中
a.date
是日期时间为varchar。
date
,smalldatetime
,datetime
和datetime2
- 并且:SQL Server将知道如何正确理解和使用该数据
最终问题是SUBSTRING(a.date, 1, 10)
没有给出SQL Server通过隐式字符串转换操作将其理解为日期的结果。这种方法是:效率低下,b:脆弱(特别是在文化之间),因此你根本就不应该这样做。如果您妥善存储数据:所有问题都将消失。
然而!您还可以使用CONVERT
告诉SQL Server将字符串解释为日期/时间,明确告诉它您期望的格式(作为数字代码),以便它有机会
如果您的a.date
(和子字符串)不是支持的格式之一:放弃所有希望。
顺便说一句;通过计算范围一次的开始日期/结束日期并仅与比较运算符进行比较,可以更有效地完成DATEDIFF(dd,GETDATE(),SUBSTRING(a.date, 1, 10))<14
。 GETDATE()
每行不会更改,因此“从现在起14天”不会每行更改。这将使您的查询更有效率,特别是与正确的日期/时间格式相结合 - 它变为:
a.date <= @end -- or < @end, or > @end, or >= @end
可以使用索引。