Mientras que las otras respuestas van a trabajar, todos ellos adolecen del mismo problema: se aplican una transformación a la columna y, por lo tanto, nunca utilizará un índice en esa columna.
Para buscar la fecha sin una transformación, necesita un par de funciones integradas y algunas matemáticas. Ejemplo a continuación:
--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
Lo que la declaración hace para evitar las transformaciones, es encontrar todos los valores de mayor que o igual a comienzos del período de tiempo actual (meses o años) y todos los valores menos que el principio del siguiente período de tiempo (inválido). Esto resuelve nuestro problema de índice y también mitiga cualquier problema relacionado con el redondeo de 3ms en el tipo DATETIME.
Consulte el comentario de Cadaeic a continuación, esta NO es una buena idea ... Su aplicación se ralentizará a medida que los datos crezcan ... –