Хотя другие ответы будут работать, все они страдают от одной и той же проблемы: они применяют преобразование к столбцу и поэтому никогда не будут использовать индекс для этого столбца.
Для поиска даты без преобразования вам понадобится пара встроенных функций и немного математики. Пример ниже:
--create a table to hold our example values
create table #DateSearch
(
TheDate datetime not null
)
insert into #DateSearch (TheDate)
--today
select getdate()
union all
--a month in advance
select dateadd(month, 1, getdate())
union all
--a year in advance
select dateadd(year, 1, getdate())
go
--declare variables to make things a little easier to see
declare @StartDate datetime, @EndDate datetime
--search for "same month+year as current date"
select @StartDate = dateadd(month, datediff(month, 0, getdate()), 0), @EndDate = dateadd(month, datediff(month, 0, getdate()) + 1, 0)
select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch
where TheDate >= @StartDate and TheDate < @EndDate
--search for "same year as current date"
select @StartDate = dateadd(year, datediff(year, 0, getdate()), 0), @EndDate = dateadd(year, datediff(year, 0, getdate()) + 1, 0)
select @StartDate [StartDate], @EndDate [EndDate], TheDate from #DateSearch
where TheDate >= @StartDate and TheDate < @EndDate
Что делает оператор, чтобы избежать преобразований, так это найти все значения, которые больше или равны началу текущего периода времени (месяц или год) И все значения меньше начала следующего (недействительного) времени период. Это решает нашу проблему с индексами, а также уменьшает любые проблемы, связанные с округлением 3 мс в типе DATETIME.