2010-10-12 2 views
10

J'ai une procédure stockée qui doit accepter un mois comme int (1-12) et une année comme int. Compte tenu de ces deux valeurs, je dois déterminer la plage de dates de ce mois. J'ai donc besoin d'une variable datetime pour représenter le premier jour de ce mois et d'une autre variable datetime pour représenter le dernier jour de ce mois. Y at-il un moyen assez facile d'obtenir cette information?SQL Server 2005 Récupère la première et la dernière date d'un mois dans une année

Répondre

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*/ 

Mais de quoi avez-vous besoin en tant que composant horaire pour le dernier jour du mois? Si vos datetimes ont des composants de temps autres que minuit, vous pouvez bien mieux de faire quelque chose comme

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

De cette façon, votre code va continuer à travailler si vous migrez finalement à SQL Server 2008 et les types de données plus datetime de précision.

+0

Merci. Cela a fonctionné. J'ai préféré cette réponse car elle semble être la plus propre. – Ristogod

18

Premier jour du mois:SELECT DATEADD(mm, DATEDIFF(mm, 0, GETDATE()), 0)

Dernier jour du mois:SELECT DATEADD(ms, -3, DATEADD(mm, DATEDIFF(m, 0, GETDATE()) + 1, 0))

de remplacement d'une valeur de la variable DateTime pour GETDATE().

Je suis tombé il ya si longtemps de this very handy page qui a tout un tas d'autres calculs de date, tels que "lundi de la semaine en cours" et "premier lundi du mois".

+0

Cela a fonctionné. Bien que j'ai choisi une réponse différente, j'ai préféré sa syntaxe. La page que vous avez liée est une excellente source d'information. Merci. – 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

Cela a fonctionné. Bien que j'ai choisi une réponse différente car je préférais sa syntaxe et la non-utilisation de la conversion. Merci. – 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

Cela a fonctionné. Bien que j'ai choisi une réponse différente car je préférais sa syntaxe et la non-utilisation de Right. Merci. – Ristogod

1

Essayez ceci:

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

Cela a fonctionné. Bien que j'ai choisi une réponse différente car je préférais sa syntaxe et la non-utilisation du casting. Merci. – 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

dernier mois en cours Date:

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

mois en cours 1er Date:

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))) 

Cela renverra la première date et la dernière date avec le composant heure.