Alors que les autres réponses fonctionnent, ils souffrent tous du même problème: ils appliquent une transformation à la colonne et n'utilisera donc jamais un index sur cette colonne.
Pour rechercher la date sans transformation, vous avez besoin de quelques fonctions intégrées et de quelques calculs mathématiques. Exemple ci-dessous:
--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
Qu'est-ce que la déclaration fait pour éviter les transformations, est de trouver toutes les valeurs plus grand ou égal au début de la période en cours (mois ou année) et toutes les valeurs moins que le début de la période de temps suivante (invalide). Cela résout notre problème d'index et atténue également tous les problèmes liés à l'arrondi 3ms dans le type DATETIME.
S'il vous plaît voir le commentaire de Cadaeic ci-dessous, ce n'est pas une bonne idée ... Votre application va ralentir que les données deviennent plus grandes ... –