web-dev-qa-db-fra.com

Comment déterminer le nombre de jours d'un mois dans SQL Server?

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?

79
Even Mien

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)))
107
Mehrdad Afshari

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
126
Mikael Eriksson

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 _

22
Daniel Davis

Beaucoup plus simple ... essayez day(eomonth(@Date))

16
Javier
--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 ...

11
Brimstedt

Je voudrais suggerer:

SELECT DAY(EOMONTH(GETDATE()))
5
gvschijndel

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.

3
Prashant
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

1
pradeep

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.

1
an40us

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]
1
Phillip Copley

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
1
Stan Scott
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]
1
Vignesh Anandaraj
select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
1
kritika
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

0
Paul
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]
0
Danyil Vlasov

en voici un autre... 

Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), 
                         DateAdd(month, 1, getdate())))
0
Charles Bretana

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.

0
DanielM

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
0
AbhishekT

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

Trouver le nombre de jours dans un mois en SQL

0
VSV AdityaSarma
   --- 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()))
0
Saikh Rakif

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