Запрос имеет другой (нет) результат при использовании параметров - PullRequest
0 голосов
/ 20 июня 2019

У меня странная проблема. Когда я выполняю следующий запрос к моей базе данных 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

Сгенерированный запрос извлекается из профилировщика Sql Server из ADO.NET ExecuterReader с теми же параметрами и значениями, который снова не возвращает записи:

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 Ответ

3 голосов
/ 20 июня 2019

Это случай, созданный неявным преобразованием на основе приоритета типа данных .

При использовании строковых литералов значения преобразуются в дату, которая фактически становится 2018-09-06 и возвращает всестроки с этой даты без учета времени.

При использовании параметров столбец неявно преобразуется в дату-время, но со временем в нулях.Это предотвратит попадание любых строк в отправленный вами диапазон даты и времени.

Другими словами, дата и время имеют более высокий приоритет, чем дата, а дата имеет более высокий приоритет, чем varchar (или другие типы строк).

...