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

Query have different (no) result when using parameters

我有一个奇怪的问题。当我 运行 对我的 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的变量或参数时,它returns没有记录:

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

以下是从 Sql 服务器分析器中提取的生成查询,来自 ADO.NET ExecuterReader,具有相同的参数和值,再次 returns 没有记录:

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

这是基于data type precedence.

的隐式转换创建的案例

使用字符串文字时,值将转换为日期,这将有效地成为 2018-09-06 和 return 从该日期开始的所有行,而不考虑时间。

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

也就是说datetime比date优先,date比varchar(或其他字符串类型)优先