使用参数时查询有不同(无)结果
Query have different (no) result when using parameters
我有一个奇怪的问题。当我 运行 对我的 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的变量或参数时,它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(或其他字符串类型)优先
我有一个奇怪的问题。当我 运行 对我的 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的变量或参数时,它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(或其他字符串类型)优先