Podczas gdy inne odpowiedzi będzie działać, wszyscy cierpią na ten sam problem: oni zastosować transformację do kolumny i dlatego nigdy nie użyje indeksu na tej kolumnie.
Aby wyszukać datę bez transformacji, potrzebujesz kilku wbudowanych funkcji i trochę matematyki. Przykład poniżej:
--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
Co oznacza stwierdzenie, aby uniknąć przemiany, to znaleźć wszystkie wartości większe niż lub równe do początku bieżącego okresu czasu (miesiąc lub rok), a wszystkie wartości mniej niż na początku następnego (nieważnego) okresu czasu. Rozwiązuje to nasz problem z indeksem, a także łagodzi wszelkie problemy związane z zaokrąglaniem 3ms w typie DATETIME.
Proszę zobaczyć komentarz Cadaeic poniżej, to NIE jest dobry pomysł ... Twoja aplikacja będzie wolniejsza, gdy dane będą większe ... –