SQL Server 2008 поиск по дате - PullRequest
0 голосов
/ 06 февраля 2012

Мне нужно искать строки, введенные в определенную дату.

Однако тип данных столбца, по которому мне нужно искать, равен datetime, а тип данных аргумента - Date.

* 1006.* Я могу использовать запрос как
Select result 
from table 
where
     convert(date, Mycolumn) = @selectedDate

, но это повлияет на SARGability запроса и не будет использовать индексы, созданные на mycolumn.

Я пытался использовать следующееquery:

Select result 
from table 
where  
  Mycolumn 
       BETWEEN @selectedDate AND Dateadd(s, -1, Dateadd(D, 1, @selectedDate)) 

Однако это не работает, поскольку @selectedDate имеет тип Date, а секунду нельзя добавить или удалить.

Может кто-нибудь помочь мне с рабочим запросом?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 10 декабря 2012

Насколько я понимаю, использование:

convert(date, Mycolumn) = @selectedDate

SARGable.Он будет использовать индекс Mycolumn (если он существует).Это легко подтвердить с помощью плана выполнения.

0 голосов
/ 06 февраля 2012

Если вам нужно много выполнять эти поиски, вы можете добавить вычисляемый постоянный столбец, который выполняет преобразование в DATE, поместить в него индекс и затем выполнить поиск по этому столбцу

ALTER TABLE dbo.YourTable
ADD DateOnly AS CAST(MyColumn AS DATE) PERSISTED

Поскольку он сохраняется, он (пере) вычисляется только при изменении значения MyColumn, например, это не «скрытый» вызов хранимой функции.Поскольку он сохраняется, его также можно индексировать и использовать, как и любой другой обычный столбец:

CREATE NONCLUSTERED INDEX IX01_YourTable_DateOnly ON dbo.YourTable(DateOnly)

, а затем выполнить:

 SELECT result FROM dbo.YourTable WHERE DateOnly = @SelectedDate

Поскольку эта дополнительная информация хранится в таблице,вы будете использовать немного больше места для хранения - так что вы делаете классический компромисс между скоростью и пространством;вам нужно немного больше места, но вы получаете больше скорости.

0 голосов
/ 06 февраля 2012
Select result 
from table 
where  
    Mycolumn >= @selectedDate 
AND Mycolumn < Dateadd(D, 1, @selectedDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...