Chcę mieć możliwość nadania procedurze składowanej miesiąca i roku i zwrócenia wszystkiego, co dzieje się w tym miesiącu. Jak to zrobić, ponieważ nie mogę porównywać, ponieważ niektóre miesiące mają różną liczbę dni itp.?
Jak najlepiej to zrobić? Czy mogę po prostu poprosić o porównanie na podstawie roku i miesiąca?
Dzięki.
sql
sql-server-2008
Tarks
źródło
źródło
Korzystanie z funkcji MIESIĄC i ROK, jak sugerowano w większości odpowiedzi, ma tę wadę, że SQL Server nie będzie w stanie użyć żadnego indeksu, który może znajdować się w kolumnie daty. Może to spowodować utratę wydajności przy dużym stole.
Byłbym skłonny przekazać wartość DATETIME (np. @StartDate) do procedury składowanej, która reprezentuje pierwszy dzień miesiąca, który Cię interesuje.
Następnie możesz użyć
SELECT ... FROM ... WHERE DateColumn >= @StartDate AND DateColumn < DATEADD(month, 1, @StartDate)
Jeśli musisz przekazać miesiąc i rok jako oddzielne parametry do procedury składowanej, możesz wygenerować DATETIME reprezentujący pierwszy dzień miesiąca za pomocą funkcji RZUTUJ i KONWERTUJ, a następnie postępuj jak powyżej. Jeśli to zrobisz, poleciłbym napisanie funkcji, która generuje DATETIME z liczb całkowitych rok, miesiąc, dzień, np. Następujące z bloga SQL Server .
create function Date(@Year int, @Month int, @Day int) returns datetime as begin return dateadd(month,((@Year-1900)*12)+@Month-1,@Day-1) end go
Zapytanie staje się wtedy:
SELECT ... FROM ... WHERE DateColumn >= Date(@Year,@Month,1) AND DateColumn < DATEADD(month, 1, Date(@Year,@Month,1))
źródło
@EndDate
sprawi , że będzie to wyraźne.Jeszcze jedna wskazówka bardzo prosta. Możesz także użyć funkcji to_char , spójrz:
Na miesiąc:
Na rok:
Na dzień:
Funkcja to_char jest obsługiwana przez język sql, a nie przez jedną konkretną bazę danych.
Mam nadzieję, że komuś bardziej pomogę ...
Abs!
źródło
Jako alternatywa dla funkcji MIESIĄC i ROK, będzie też działać zwykła klauzula WHERE:
select * from yourtable where '2009-01-01' <= datecolumn and datecolumn < '2009-02-01'
źródło
Jeśli używasz SQL Server, zajrzyj do DATEPART.
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
DATEPART (mm, [DATA, NA KTÓRĄ SZUKASZ])
Możesz wtedy użyć normalnej logiki całkowitej. To samo co rok, po prostu użyj rr zamiast mm.
źródło
Możesz. Oto prosty przykład użycia przykładowej bazy danych AdventureWorks ...
DECLARE @Year INT DECLARE @Month INT SET @Year = 2002 SET @Month = 6 SELECT [pch].* FROM [Production].[ProductCostHistory] pch WHERE YEAR([pch].[ModifiedDate]) = @Year AND MONTH([pch].[ModifiedDate]) = @Month
źródło
Łatwiej mi jest przekazać wartość jako tymczasowy typ danych (np.
DATETIME
), A następnie użyć funkcji czasowej, w szczególnościDATEADD
iDATEPART
, aby znaleźć datę początkową i końcową dla okresu, w tym przypadku miesiąc, np. Znajduje to datę początkową i datę końcową dla bieżącego miesiąca wystarczy podstawićCURRENT_TIMESTAMP
za siebie parametr typuDATETIME
(zwróć uwagę, że wartość 1990-01-01 jest całkowicie dowolna):SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-01T00:00:00.000'), DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T23:59:59.997')
źródło
Coś takiego powinno to zrobić:
select * from yourtable where datepart(month,field) = @month and datepart(year,field) = @year
Alternatywnie możesz podzielić miesiąc i rok na osobne kolumny podczas tworzenia rekordu, a następnie dokonać wyboru.
Iain
źródło
Jednym ze sposobów byłoby utworzenie zmiennej, która reprezentuje pierwszy dzień miesiąca (np. 5/1/2009), albo przekazanie jej do procesu, albo zbudowanie (konkatenacja miesiąca / 1 / rok). Następnie użyj funkcji DateDiff.
Zwróci wszystko, co ma pasujący miesiąc i rok.
źródło
SELECT * FROM yourtable WHERE yourtimestampfield LIKE 'AAAA-MM%';
Gdzie
AAAA
jest rok, który chcesz iMM
miesiąc, który chceszźródło