Como determinar o número de dias em um mês no SQL Server?

Eu preciso determinar o número de dias em um mês para uma determinada data no SQL Server.

Existe uma function interna? Se não, o que devo usar como function definida pelo usuário?

    Você pode usar o seguinte com o primeiro dia do mês especificado:

    datediff(day, @date, dateadd(month, 1, @date)) 

    Para que funcione para todas as datas:

     datediff(day, dateadd(day, 1-day(@date), @date), dateadd(month, 1, dateadd(day, 1-day(@date), @date))) 

    No SQL Server 2012, você pode usar o EOMONTH (Transact-SQL) para obter o último dia do mês e, em seguida, usar o DAY (Transact-SQL) para obter o número de dias do mês.

     DECLARE @ADate DATETIME SET @ADate = GETDATE() SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth 

    Solução mais elegante: funciona para qualquer @DATE

     DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,@DATE),0))) 

    Jogue-o em uma function ou apenas use-o em linha. Isso responde à pergunta original sem todo o lixo extra nas outras respostas.

    exemplos para datas de outras respostas:

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

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

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

    Muito mais simples … try 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))) 

    Pessoalmente, eu faria uma UDF para ela se não houvesse uma function interna …

    Eu sugeriria:

     SELECT DAY(EOMONTH(GETDATE())) 

    Este código mostra o número de dias no mês atual:

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

    Altere getdate() para a data na qual você precisa contar dias.

    Solução 1: encontre o número de dias no mês em que estamos atualmente

     DECLARE @dt datetime SET @dt = getdate() SELECT @dt AS [DateTime], DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month] 

    Solução 2: encontre o número de dias em uma combinação de mês e ano

     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] 

    Você precisa adicionar uma function, mas é simples. Eu uso isso:

     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 datediff(day, dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3 - 1, 0)), dateadd(day, 0, dateadd(month, ((2013 - 1900) * 12) + 3, 0)) ) 

    Nice Simples e não requer criação de nenhuma function.

    Você precisa criar uma function, mas é para sua própria conveniência. Ele funciona perfeito e nunca encontrei cálculos defeituosos usando essa function.

     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 

    Como funciona: subtraindo o número do dia da data da data em si lhe dá o último dia do mês anterior. Então, você precisa adicionar um mês à data indicada, subtrair o número do dia e obter o componente dia do resultado.

    Eu votei em Mehrdad, mas isso também funciona. 🙂

     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 

    Testar

     declare @testDT datetime; set @testDT = '2404-feb-15'; select dbo.GetDaysInMonth(@testDT) 

    aqui está mais um…

     Select Day(DateAdd(day, -Day(DateAdd(month, 1, getdate())), DateAdd(month, 1, getdate()))) 

    Eu sei que essa pergunta é antiga, mas pensei em compartilhar o que estou usando.

     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 

    e

     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 

    Esses podem ser combinados para criar uma única function para recuperar o número de dias em um mês, se necessário.

     SELECT DAY(SUBDATE(ADDDATE(CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-1'), INTERVAL 1 MONTH), INTERVAL 1 DAY)) 

    Nice ‘n’ Simples e não requer a criação de nenhuma function

    A resposta de Mehrdad Afshari é a mais precisa, além do usual, esta resposta é baseada na abordagem matemática formal dada por Curtis McEnroe em seu 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 

    Para obter o não. de dias em um mês, podemos usar diretamente Day () disponível em SQL.

    Siga o link postado no final da minha resposta para o SQL Server 2005/2008.

    O exemplo a seguir e o resultado são do 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') 

    Resultado no SQL Server SSMS

      (no column name) 1 31 

    Processo:

    Quando o EOMONTH é usado, o formato de data que usamos é convertido no formato DateTime do SQL-server. Em seguida, a saída de data de EOMONTH () será 2016-12-31 tendo 2016 como ano, 12 como mês e 31 como dias. Essa saída, quando passada para Day (), fornece a contagem total de dias no mês.

    Se quisermos obter o resultado instantâneo para verificação, podemos executar diretamente o código abaixo,

     select DAY(EOMONTH(convert(datetime,'08/12/2016',103))) 

    ou

     select DAY(EOMONTH(convert(datetime,getdate(),103))) 

    para referência para trabalhar no SQL Server 2005/2008/2012, por favor siga o seguinte link externo …

    Encontre o número de dias em um mês no SQL

    Para qualquer data

     select DateDiff(Day,@date,DateAdd(month,1,@date)) 
     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))) 

    consulta simples no SQLServer2012:

    selecione o dia ((’20-05-1951 22:00:00′))

    Eu testei para muitas datas e retornar sempre um resultado correto

    selecione first_day = dateadd (dd, -1 * parta de data (dd, getdate ()) + 1, getdate ()), last_day = dateadd (dd, -1 * parta de data (dd, dateadd (mm, 1, getdate ())) , dateadd (mm, 1, getdate ())), no_de_dias = 1 + datediff (dd, dateadd (dd, -1 * parta de data (dd, getdate ()) + 1, getdate ()), dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, getdate ())), dateadd (mm, 1, getdate ())))

    substitua qualquer data por getdate para obter o número de meses nessa data específica

     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 
     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'; 

    Resultado: Este Mês 31

    Próximo Mês 30