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
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.
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".
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
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;
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
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
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
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;
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
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)
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())
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.
Merci. Cela a fonctionné. J'ai préféré cette réponse car elle semble être la plus propre. – Ristogod