2010-10-12 9 views
10

Ich habe eine gespeicherte Prozedur, die einen Monat als int (1-12) und ein Jahr als int akzeptieren muss. Angesichts dieser beiden Werte muss ich den Datumsbereich dieses Monats bestimmen. Also brauche ich eine Datetime-Variable, um den ersten Tag des Monats darzustellen, und eine andere Datetime-Variable, um den letzten Tag des Monats darzustellen. Gibt es eine ziemlich einfache Möglichkeit, diese Informationen zu erhalten?SQL Server 2005 Erste und letzte Datum für einen beliebigen Monat in einem Jahr

Antwort

14
DECLARE @Month int 
DECLARE @Year int 

set @Month = 2 
set @Year = 2004 

select DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0)) /*First*/ 

select DATEADD(day,-1,DATEADD(month,@Month,DATEADD(year,@Year-1900,0))) /*Last*/ 

Aber was brauchen Sie als Zeitkomponente für den letzten Tag des Monats? Wenn Ihre Datetimes Zeitkomponenten haben andere als Mitternacht können Sie auch besser dran, nur etwas zu tun, wie

WHERE COL >= DATEADD(month,@Month-1,DATEADD(year,@Year-1900,0)) 
    AND COL < DATEADD(month,@Month,DATEADD(year,@Year-1900,0)) 

Auf diese Weise wird auch weiterhin Ihr Code arbeiten, wenn Sie schließlich auf SQL Server 2008 und die größeren Präzision Datetime-Datentypen migrieren.

+0

Danke. Das hat funktioniert. Ich zog diese Antwort vor, weil sie am saubersten zu sein scheint. – Ristogod

18

Erster Tag des Monats:SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)

Letzter Tag des Monats:SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))

Ersatz ein Datetime-Variablenwert für GETDATE().

Ich habe das vor langer Zeit von this very handy page, die eine ganze Reihe von anderen Datumsberechnungen wie "Montag der aktuellen Woche" und "ersten Montag des Monats" hat.

+0

Das hat funktioniert. Obwohl ich eine andere Antwort wählte, weil ich seine Syntax bevorzugte. Die von Ihnen verlinkte Seite ist eine großartige Informationsquelle. Vielen Dank. – Ristogod

1
DECLARE @Month int; 
DECLARE @Year int; 
DECLARE @FirstDayOfMonth DateTime; 
DECLARE @LastDayOfMonth DateTime; 

SET @Month = 3 
SET @Year = 2010 

SET @FirstDayOfMonth = CONVERT(datetime, CAST(@Month as varchar) + '/01/' + CAST(@Year as varchar)); 
SET @LastDayOfMonth = DATEADD(month, 1, CONVERT(datetime, CAST(@Month as varchar)+ '/01/' + CAST(@Year as varchar))) - 1; 
+0

Das hat funktioniert. Obwohl ich eine andere Antwort wählte, weil ich die Syntax und die Nichtverwendung der Konvertierung bevorzugte. Vielen Dank. – Ristogod

1
DECLARE @Month INTEGER 
DECLARE @Year INTEGER 
SET @Month = 10 
SET @Year = 2010 

DECLARE @FirstDayOfMonth DATETIME 
DECLARE @LastDayOfMonth DATETIME 

SET @FirstDayOfMonth = Str(@Year) + RIGHT('0' + Str(@Month), 2) + '01' 
SET @LastDayOfMonth = DATEADD(dd, -1, DATEADD(mm, 1, @FirstDayOfMOnth)) 
SELECT @FirstDayOfMonth, @LastDayOfMonth 
+0

Das hat funktioniert. Obwohl ich eine andere Antwort wählte, bevorzugte ich die Syntax und die Nichtbenutzung von Right. Vielen Dank. – Ristogod

1

Versuchen Sie folgendes:

Declare @month int, @year int; 
Declare @first DateTime, @last DateTime; 
Set @month=10; 
Set @year=2010; 
Set @first=CAST(CAST(@year AS varchar) + '-' + CAST(@month AS varchar) + '-' + '1' AS DATETIME); 
Set @last=DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@first)+1,0)); 

SELECT @first,@last; 
+0

Das hat funktioniert. Obwohl ich eine andere Antwort wählte, bevorzugte ich die Syntax und die Nichtverwendung von Casting. Vielen Dank. – Ristogod

1
select [FirstDay Of The Month] as Text ,convert(varchar,dateadd(d,-(day(getdate()-1)),getdate()),106) 'Date' 
union all 
select [LastDay Of The Month], convert(varchar,dateadd(d,-day(getdate()),dateadd(m,1,getdate())),106) 
0

Aktueller Monat letzte Datum:

select dateadd(dd,-day(dateadd(mm,1,getdate())),dateadd(mm,1,getdate())) 

Aktueller Monat 1. Datum:

select dateadd(dd,-day(getdate())+1,getdate()) 
1
DECLARE @Month int = 3, @Year int = 2016 
DECLARE @StartDate DATETIME 
DECLARE @EndDate DATETIME 

-- First date of month 
SET @StartDate = DATEADD(MONTH, @Month-1, DATEADD(YEAR, @Year-1900, 0)); 
-- Last date of month 
SET @EndDate = DATEADD(SS, -1, DATEADD(MONTH, @Month, DATEADD(YEAR, @Year-1900, 0))) 

Dies wird erstes Datum und letztes Datum mit Zeitkomponente zurückgeben.

Verwandte Themen