我有一个奇怪的问题。当我对我的Sql Server 2014
数据库运行以下查询时,结果是预期的(请注意LogDay
是DATE
不是 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
答案 0 :(得分:3)
这是通过基于data type precedence的隐式转换创建的情况。
使用字符串文字时,值将转换为日期,该日期将有效地变为2018-09-06
并返回该日期之后的所有行,而无需考虑时间。
使用参数时,该列是隐式转换为日期时间的列,但时间为零。这样可以防止任何行都在您发送的日期时间范围内。
换句话说,datetime的优先级高于date,date的优先级高于varchar(或其他字符串类型)。