2009-02-13 12 views
5

Używanie SQL Server 2005 Mam pole, które zawiera wartość datetime.Porównaj bieżącą datę z przechowywaną datetime używając tylko miesiąca w roku

Co staram się zrobić, to utworzyć 2 zapytania:

  1. Porównaj aby sprawdzić, czy zapisane datetime jest tego samego miesiąca + rok jako bieżącej daty
  2. Porównaj aby sprawdzić, czy zapisane datetime jest taka sama rok jako data aktualna

Prawdopodobnie istnieje proste rozwiązanie, ale ciągle uderzam w ściany z cegły używając różnych próbek, które mogę znaleźć, jakieś myśli?

Z góry dziękuję.

Odpowiedz

7

Porównaj części Data:

WHERE YEAR(columnName) = YEAR(getDate()) 
+1

Proszę zobaczyć komentarz Cadaeic poniżej, to NIE jest dobry pomysł ... Twoja aplikacja będzie wolniejsza, gdy dane będą większe ... –

0

Funkcja datepart pozwala wyciągnąć bity potrzebujesz:

declare @d1 as datetime 
declare @d2 as datetime 

if datepart(yy, @d1) = datepart(yy, @d2) and datepart(mm, @d1) = datepart(mm, @d2) begin 
    print 'same' 
end 
2
SELECT * FROM atable 
WHERE 
    YEAR(adate) = YEAR(GETDATE()) 
AND 
    MONTH(adate) = MONTH(GETDATE()) 
0

Można użyć coś takiego

)

select * 
from table 
where MONTH(field) = MONTH(GetDATE()) 
    and YEAR(field) = YEAR(GetDATE()) 

b)

select * 
from table 
where YEAR(field) = YEAR(GetDATE()) 
2

To brzmi dla mnie jak DATEDIFF jest dokładnie to, czego potrzebujesz:

-- #1 same month and year 
SELECT * 
FROM your_table 
WHERE DATEDIFF(month, your_column, GETDATE()) = 0 

-- #2 same year 
SELECT * 
FROM your_table 
WHERE DATEDIFF(year, your_column, GETDATE()) = 0 
5

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.

Powiązane problemy