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

95

J'ai besoin de déterminer le nombre de jours dans un mois pour une date donnée dans SQL Server.

Existe-t-il une fonction intégrée? Sinon, que dois-je utiliser comme fonction définie par l'utilisateur?

Même Mien
la source

Réponses:

115

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)))
Mehrdad Afshari
la source
2
Comme le dit Stan, cela donnera des résultats inexacts dans certains cas
DJ.
3
ne voulez-vous pas dire: dateadd (jour, dateadd (jour, 1 jour (@date), @date), dateadd (mois, 1, dateadd (jour, 1 jour (@date), @date)))
feihtthief
3
C'est un cas rare, mais je suis juste tombé dessus: cela lancera une erreur pour décembre 9999.
Heinzi
1
Cela ne fonctionne pour aucune date en décembre 9999. Vous obtenez un débordement sur le type de date. Cela a fonctionné pour moi dans SQL Server 2014: case when datediff(m, dateadd(day, 1-day(@date), @date), convert(date, convert(datetime, 2958463))) > 0 then datediff(day, dateadd(day, 1-day(@date), @date), dateadd(month, 1, dateadd(day, 1-day(@date), @date))) else 31 end
bradwilder31415
2
Toutes les solutions mentionnées ici pâlissent par rapport à l'élégance de la réponse de @Mikael Eriksson . Cela fonctionne chaque fois qu'une date valide est fournie sans solutions de contournement folles pour les cas de niche et c'est un code beaucoup plus simple - je recommande vivement à quiconque sur le bâton T-SQL d'obtenir le daycomposant de la eomonthsortie.
bsplosion
148

Dans SQL Server 2012, vous pouvez utiliser EOMONTH (Transact-SQL) pour obtenir le dernier jour du mois, puis vous pouvez utiliser DAY (Transact-SQL) pour obtenir le nombre de jours du mois.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
Mikael Eriksson
la source
1
Et si vous avez besoin du nombre de jours dans une donnée, vous pouvez également utiliser la méthode DATEFROMPARTS. Le code ci-dessus deviendrait SELECT DAY (EOMONTH (DATEFROMPARTS (@year, @month, 1))) AS DaysInMonth
nmariot
La beauté de cette solution entre en jeu si @ADate est une valeur calculée complexe! +1
Stefan Steiger
Merci beaucoup!
Rejwanul Reja
27

Solution la plus élégante: fonctionne pour n'importe quel @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 d'origine sans tous les indésirables supplémentaires dans les autres réponses.

exemples de dates d'autres réponses:

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'1/31/2009'),0))) Renvoie 31

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2404-feb-15'),0))) Renvoie 29

SELECT DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,'2011-12-22'),0))) Renvoie 31

Daniel Davis
la source
22

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

Javier
la source
1
Je pense que votre réponse est la meilleure, si simple. Merci!
Ofear
12
--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 créerais un UDF pour cela s'il n'y avait pas de fonction intégrée ...

Brimstedt
la source
5

Je voudrais suggerer:

SELECT DAY(EOMONTH(GETDATE()))
gvschijndel
la source
datepart ne renvoie pas le nombre de jours et votre réponse est également fausse
TheGameiswar
Cela a fonctionné pour moi, mais l'utilisation de la fonction jour serait une réponse plus claire
gvschijndel
2
cette réponse est presque identique à celle ci-dessous avec des votes de 75.
Hila DG
3

Ce code vous donne le nombre de jours du mois en cours:

SELECT datediff(dd,getdate(),dateadd(mm,1,getdate())) as datas

Modifiez getdate()la date pour laquelle vous devez compter les jours.

Prashant
la source
2
   --- 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()))
Saikh Rakif
la source
1

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 une combinaison mois-année donnée

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

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
hims056
la source
1
La combinaison de DATEDIFF et DATEADD, d'ailleurs, ne fonctionne pas toujours. Si vous y mettez une date du 31/01/2009, le DATEADD reviendra le 28/02/2009 et le DATEDIFF vous donnera 28 au lieu de 31.
comment vérifier, je veux dire quoi exécuter pour vérifier les jours dans un mois ??
hud
1
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]
Vignesh Anandaraj
la source
1
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 pas de création de fonctions Fonctionne bien

pradeep
la source
1

Vous devez créer une fonction, mais c'est pour votre propre convenance. Cela fonctionne parfaitement et je n'ai jamais rencontré de calculs défectueux en utilisant 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 cela fonctionne: en soustrayant le numéro du jour de la date de 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 numéro du jour et obtenir la composante jour du résultat.

an40us
la source
1
select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;
Kritika
la source
0

J'ai voté pour 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)
feihtthief
la source
0

En voici un autre...

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

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 peuvent être combinés pour créer une seule fonction permettant de récupérer le nombre de jours dans un mois si nécessaire.

DanielM
la source
0
SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY))

Nice 'n' Simple et ne nécessite pas de création de fonctions

Paul
la source
Ceci est pour SQL Server; Je n'ai jamais entendu parler d'une subdatefonction.
LittleBobbyTables - Au Revoir
0

La réponse de Mehrdad Afshari est la plus précise, sauf d'habitude, cette réponse est basée sur une 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
AbhishekT
la source
0

Pour obtenir le non. de jours dans un mois, nous pouvons directement utiliser Day () disponible en SQL.

Suivez le lien posté à 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é, quel que soit le format de date que nous utilisons, il est converti au format DateTime du serveur SQL. Ensuite, la sortie de date de EOMONTH () sera 2016-12-31 ayant 2016 comme année, 12 comme mois et 31 comme jours. Cette sortie, une fois passée dans Day (), vous donne le nombre total de jours dans le 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 référence au travail dans SQL Server 2005/2008/2012, veuillez suivre le lien externe suivant ...

Rechercher le nombre de jours dans un mois dans SQL

VSV AdityaSarma
la source
0
DECLARE @date DATETIME = GETDATE(); --or '12/1/2018' (month/day/year) 
SELECT DAY(EOMONTH ( @date )) AS 'This Month'; 
SELECT DAY(EOMONTH ( @date, 1 )) AS 'Next Month';

résultat: Ce mois 31

Le mois prochain 30

Ardem
la source
cela ne renvoie pas le nombre de jours dans le mois
ashleedawg
Oui. Mais uniquement pour SQL Server 2012 et supérieur
Alberto Cláudio Mandlate
0
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]
Danyil Vlasov
la source
0
RETURN day(dateadd(month, 12 * @year + @month - 22800, -1)) 
select day(dateadd(month, 12 * year(date) + month(date) - 22800, -1)) 
Milan Hettner
la source
-1

Pour n'importe quelle date

select DateDiff(Day,@date,DateAdd(month,1,@date))
Sujith
la source
-1
DECLARE @date nvarchar(20)
SET @date ='2012-02-09 00:00:00'
SELECT DATEDIFF(day,cast(replace(cast(YEAR(@date) as char)+'-'+cast(MONTH(@date) as char)+'-01',' ','')+' 00:00:00' as datetime),dateadd(month,1,cast(replace(cast(YEAR(@date) as char)+'-'+cast(MONTH(@date) as char)+'-01',' ','')+' 00:00:00' as datetime)))
ATUL KALASKAR
la source
-1

requête simple dans SQLServer2012:

sélectionner le jour (('20-05-1951 22:00:00'))

j'ai testé pour de nombreuses dates et il renvoie toujours un résultat correct

zied zelfani
la source
2
SELECT DAY (CAST ('1951-05-20' AS DATE)) renvoie 20 qui est la partie jour de la date. Il ne renvoie pas le nombre de jours du mois de mai.
Even Mien
-1

sélectionnez first_day = dateadd (dd, -1 * datepart (dd, getdate ()) + 1, getdate ()), last_day = dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ())) , dateadd (mm, 1, getdate ())), no_of_days = 1 + dateiff (jj, dateadd (jj, -1 * datepart (jj, getdate ()) + 1, getdate ()), dateadd (jj, -1 * datepart (jj, dateadd (mm, 1, getdate ())), dateadd (mm, 1, getdate ())))

remplacez n'importe quelle date par getdate pour obtenir le nombre de mois de cette date particulière

Matricks
la source
-1
DECLARE @Month INT=2,
    @Year INT=1989
DECLARE @date DateTime=null
SET @date=CAST(CAST(@Year AS nvarchar) + '-' + CAST(@Month AS nvarchar) + '-' + '1' AS DATETIME);

DECLARE @noofDays TINYINT 
DECLARE @CountForDate TINYINT
SET @noofDays = DATEPART(MONTH,@date )
SET @CountForDate = 28 + (@noofDays + floor(@noofDays/8)) % 2 + 2 %    @noofDays + 2 * floor(1/@noofDays)   
SET @noofDays= @CountForDate + CASE WHEN @CountForDate = 28 AND DATEPART(YEAR,@date)%4 =0 THEN 1 ELSE 0 END
PRINT @noofDays
Diable
la source
1
Salut et bienvenue à SO! Bien que le code puisse parler de lui-même, certains détails contribueraient à améliorer la qualité de votre réponse!
mrun