使用参数时查询结果不同(否)

时间:2019-06-20 12:45:52

标签: sql-server ado.net sql-server-2014

我有一个奇怪的问题。当我对我的Sql Server 2014数据库运行以下查询时,结果是预期的(请注意LogDayDATE 不是 DATETIME):

SELECT * FROM  myView WHERE LogDay BETWEEN '2018-09-06 01:01:59.000' AND '2018-09-06 01:31:59.000';

但是当我使用ADO.NET中的变量或参数时,它不返回任何记录:

DECLARE @startDate datetime,@toDate DATETIME
SET @startDate='2018-09-06 01:01:59.000';
SET @toDate='2018-09-06 01:31:59.000';

SELECT * FROM  myView WHERE LogDay BETWEEN @startDate AND @toDate;--returns no record

以下是生成的查询,该查询是使用相同的参数和值从ADO.NET ExecuterReader的Sql Server分析器中提取的,该参数和值再次不返回任何记录:

exec sp_executesql N'SELECT * FROM  myView WHERE LogDay BETWEEN @startDate AND @toDate;',N'@startDate datetime,@toDate datetime',@startDate='2018-09-06 01:01:00',@toDate='2018-09-06 01:31:00' --no record

1 个答案:

答案 0 :(得分:3)

这是通过基于data type precedence的隐式转换创建的情况。

使用字符串文字时,值将转换为日期,该日期将有效地变为2018-09-06并返回该日期之后的所有行,而无需考虑时间。

使用参数时,该列是隐式转换为日期时间的列,但时间为零。这样可以防止任何行都在您发送的日期时间范围内。

换句话说,datetime的优先级高于date,date的优先级高于varchar(或其他字符串类型)。