Je dois déterminer le nombre de jours d'un mois pour une date donnée dans SQL Server.
Y a-t-il une fonction intégrée? Sinon, que dois-je utiliser comme fonction définie par l'utilisateur?
Vous pouvez utiliser les éléments suivants avec le premier jour du mois spécifié:
datediff(day, @date, dateadd(month, 1, @date))
Pour que cela fonctionne pour chaque date:
datediff(day, dateadd(day, 1-day(@date), @date),
dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
Dans SQL Server 2012, vous pouvez utiliser EOMONTH (Transact-SQL) pour obtenir le dernier jour du mois, puis DAY (Transact-SQL) pour obtenir le nombre de jours du mois.
DECLARE @ADate DATETIME
SET @ADate = GETDATE()
SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
La solution la plus élégante: fonctionne pour tout @DATE
DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0)))
Jetez-le dans une fonction ou utilisez-le simplement en ligne. Cela répond à la question initiale sans toutes les ordures supplémentaires des autres réponses.
exemples de dates d'autres réponses:
SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0)))
Returns 31 _
SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0)))
Returns 29 _
SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0)))
Returns 31 _
Beaucoup plus simple ... essayez day(eomonth(@Date))
--Last Day of Previous Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)))
--Last Day of Current Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)))
--Last Day of Next Month
SELECT DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)))
Personnellement, je ferais un fichier UDF s'il n'y a pas de fonction intégrée ...
Je voudrais suggerer:
SELECT DAY(EOMONTH(GETDATE()))
Ce code vous donne le nombre de jours du mois en cours:
SELECT datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas
Remplacez getdate()
par la date pour laquelle vous devez compter les jours.
select datediff(day,
dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)),
dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3, 0))
)
Nice Simple et ne nécessite aucune fonction de création Work Fine
Vous devez créer une fonction, mais c'est pour votre propre commodité. Cela fonctionne parfaitement et je n’ai jamais rencontré de calcul défectueux avec cette fonction.
CREATE FUNCTION [dbo].[get_days](@date datetime)
RETURNS int
AS
BEGIN
SET @date = DATEADD(MONTH, 1, @date)
DECLARE @result int = (select DAY(DATEADD(DAY, -DAY(@date), @date)))
RETURN @result
END
Comment ça marche: en soustrayant le numéro de jour de la date à la date elle-même, vous obtenez le dernier jour du mois précédent. Donc, vous devez ajouter un mois à la date donnée, soustraire le nombre de jours et obtenir la composante jour du résultat.
Solution 1: Trouvez le nombre de jours dans le mois où nous sommes actuellement
DECLARE @dt datetime
SET @dt = getdate()
SELECT @dt AS [DateTime],
DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month]
Solution 2: Trouver le nombre de jours dans un combo mois-année donné
DECLARE @y int, @m int
SET @y = 2012
SET @m = 2
SELECT @y AS [Year],
@m AS [Month],
DATEDIFF(DAY,
DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m - 1, 0)),
DATEADD(DAY, 0, DATEADD(m, ((@y - 1900) * 12) + @m, 0))
) AS [Days in Month]
Vous devez ajouter une fonction, mais c'est simple. J'utilise ceci:
CREATE FUNCTION [dbo].[ufn_GetDaysInMonth] ( @pDate DATETIME )
RETURNS INT
AS
BEGIN
SET @pDate = CONVERT(VARCHAR(10), @pDate, 101)
SET @pDate = @pDate - DAY(@pDate) + 1
RETURN DATEDIFF(DD, @pDate, DATEADD(MM, 1, @pDate))
END
GO
SELECT Datediff(day,
(Convert(DateTime,Convert(varchar(2),Month(getdate()))+'/01/'+Convert(varchar(4),Year(getdate())))),
(Convert(DateTime,Convert(varchar(2),Month(getdate())+1)+'/01/'+Convert(varchar(4),Year(getdate()))))) as [No.of Days in a Month]
select add_months(trunc(sysdate,'MM'),1) - trunc(sysdate,'MM') from dual;
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))
Nice 'n' Simple et ne nécessite aucune fonction créée
DECLARE @m int
SET @m = 2
SELECT
@m AS [Month],
DATEDIFF(DAY,
DATEADD(DAY, 0, DATEADD(m, +@m -1, 0)),
DATEADD(DAY, 0, DATEADD(m,+ @m, 0))
) AS [Days in Month]
en voici un autre...
Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())),
DateAdd(month, 1, getdate())))
Je sais que cette question est ancienne mais je pensais partager ce que j'utilise.
DECLARE @date date = '2011-12-22'
/* FindFirstDayOfMonth - Find the first date of any month */
-- Replace the day part with -01
DECLARE @firstDayOfMonth date = CAST( CAST(YEAR(@date) AS varchar(4)) + '-' +
CAST(MONTH(@date) AS varchar(2)) + '-01' AS date)
SELECT @firstDayOfMonth
et
DECLARE @date date = '2011-12-22'
/* FindLastDayOfMonth - Find what is the last day of a month - Leap year is handled by DATEADD */
-- Get the first day of next month and remove a day from it using DATEADD
DECLARE @lastDayOfMonth date = CAST( DATEADD(dd, -1, DATEADD(mm, 1, FindFirstDayOfMonth(@date))) AS date)
SELECT @lastDayOfMonth
Ceux-ci pourraient être combinés pour créer une seule fonction permettant de récupérer le nombre de jours d'un mois si nécessaire.
La réponse de Mehrdad Afshari est la plus précise, à part l'habitude, cette réponse est basée sur l'approche mathématique formelle donnée par Curtis McEnroe dans son blog https://cmcenroe.me/2014/12/05/days-in-month-formula. html
DECLARE @date DATE= '2015-02-01'
DECLARE @monthNumber TINYINT
DECLARE @dayCount TINYINT
SET @monthNumber = DATEPART(MONTH,@date )
SET @dayCount = 28 + (@monthNumber + floor(@monthNumber/8)) % 2 + 2 % @monthNumber + 2 * floor(1/@monthNumber)
SELECT @dayCount + CASE WHEN @dayCount = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END -- leap year adjustment
Pour obtenir le non. de jours dans un mois, nous pouvons directement utiliser Day () disponible en SQL.
Suivez le lien affiché à la fin de ma réponse pour SQL Server 2005/2008.
L'exemple suivant et le résultat proviennent de SQL 2012
alter function dbo.[daysinm]
(
@dates nvarchar(12)
)
returns int
as
begin
Declare @dates2 nvarchar(12)
Declare @days int
begin
select @dates2 = (select DAY(EOMONTH(convert(datetime,@dates,103))))
set @days = convert(int,@dates2)
end
return @days
end
--select dbo.daysinm('08/12/2016')
Résultat dans SQL Server SSMS
(no column name)
1 31
Processus:
Lorsque EOMONTH est utilisé, le format de date utilisé est converti au format DateTime de SQL-server. La date de sortie de EOMONTH () sera le 2016-12-31 ayant 2016 comme année, 12 comme mois et 31 comme jours . Cette sortie, lorsqu'elle est passée à Day (), indique le nombre total de jours du mois.
Si nous voulons obtenir le résultat instantané pour vérification, nous pouvons directement exécuter le code ci-dessous,
select DAY(EOMONTH(convert(datetime,'08/12/2016',103)))
ou
select DAY(EOMONTH(convert(datetime,getdate(),103)))
pour pouvoir travailler dans SQL Server 2005/2008/2012, veuillez suivre le lien externe suivant ...
--- sql server below 2012---
select day( dateadd(day,-1,dateadd(month, 1, convert(date,'2019-03-01'))))
-- this for sql server 2012--
select day(EOMONTH(getdate()))
J'ai voté Mehrdad, mais cela fonctionne aussi. :)
CREATE function dbo.IsLeapYear
(
@TestYear int
)
RETURNS bit
AS
BEGIN
declare @Result bit
set @Result =
cast(
case when ((@TestYear % 4 = 0) and (@testYear % 100 != 0)) or (@TestYear % 400 = 0)
then 1
else 0
end
as bit )
return @Result
END
GO
CREATE FUNCTION dbo.GetDaysInMonth
(
@TestDT datetime
)
RETURNS INT
AS
BEGIN
DECLARE @Result int
DECLARE @MonthNo int
Set @MonthNo = datepart(m,@TestDT)
Set @Result =
case @MonthNo
when 1 then 31
when 2 then
case
when dbo.IsLeapYear(datepart(yyyy,@TestDT)) = 0
then 28
else 29
end
when 3 then 31
when 4 then 30
when 5 then 31
when 6 then 30
when 7 then 31
when 8 then 31
when 9 then 30
when 10 then 31
when 11 then 30
when 12 then 31
end
RETURN @Result
END
GO
Tester
declare @testDT datetime;
set @testDT = '2404-feb-15';
select dbo.GetDaysInMonth(@testDT)