Domanda

Ho bisogno di determinare il numero di giorni in un mese per una data in SQL Server.

C'è una funzione built-in?Se no, cosa devo usare la funzione definita dall'utente?

È stato utile?

Soluzione

È possibile utilizzare il seguente con il primo giorno del mese specificato:

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

Per farlo funzionare per ogni data:

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

Altri suggerimenti

In SQL Server 2012 è possibile utilizzare EOMONTH (Transact-SQL) per ottenere l'ultimo giorno del mese e poi si può usare gIORNO (Transact-SQL) per ottenere il numero di giorni del mese.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth

soluzione più elegante: funziona per qualsiasi @DATE

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

Buttalo in una funzione o semplicemente utilizzarlo in linea. Ciò risponde alla domanda originale senza tutte le cianfrusaglie in più nelle altre risposte.

esempi per le date da altre risposte:

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

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

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

Molto più semplice ... provare 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)))

Personalmente, però, vorrei fare un'UDF per esso, se non v'è una costruito in funzione ...

Vorrei suggerire:

SELECT DAY(EOMONTH(GETDATE()))

Questo codice si ottiene il numero di giorni nel mese corrente:

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

Cambia getdate() per la data è necessario contare giorni per.

   --- 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()))

Soluzione 1: Trovare il numero di giorni in qualunque mese siamo attualmente in

DECLARE @dt datetime
SET     @dt = getdate()

SELECT @dt AS [DateTime],
       DAY(DATEADD(mm, DATEDIFF(mm, -1, @dt), -1)) AS [Days in Month]

Soluzione 2: Trovare il numero di giorni in un combo dato mese-anno

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]

Si ha bisogno di aggiungere una funzione, ma è un semplice. Io uso questo:

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

Nizza semplice e non richiede la creazione di alcuna funzione di funzionare bene

È necessario creare una funzione, ma è per la vostra convenienza. Esso funziona perfettamente e non ho mai incontrato alcun calcolo difettosi di utilizzare questa funzione.

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

Come funziona: sottraendo numero del giorno della data a partire dalla data stessa ti dà l'ultimo giorno del mese precedente. Quindi, è necessario aggiungere un mese per la data indicata, sottrarre il numero del giorno e ottenere la componente giorno del risultato.

select add_months(trunc(sysdate,'MM'),1) -  trunc(sysdate,'MM') from dual;

I upvoted Mehrdad, ma questo funziona pure. :)

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

Per testare

declare @testDT datetime;

set @testDT = '2404-feb-15';

select dbo.GetDaysInMonth(@testDT)

Ecco un altro ...

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

So che questa domanda è vecchio, ma ho pensato di condividere ciò che sto 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

Quelli potrebbero essere combinano per creare una singola funzione per recuperare il numero di giorni in un mese, se necessario.

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

Nice 'n' semplice e non richiede la creazione di alcuna funzione

replica Mehrdad Afshari è più accurato, a parte dal solito questa risposta si basa su un approccio matematico formale da Curtis McEnroe nel suo 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

Per ottenere il no. di giorni in un mese siamo in grado di utilizzare direttamente Day () disponibili in SQL.

Segui il link postato alla fine della mia risposta per SQL Server 2005/2008.

Il seguente esempio e il risultato sono da 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')

Risultato in SSMS SQL Server

  (no column name)
1 31

Processo:

Quando si usa FINE.MESE, a seconda di quale il formato della data che utilizziamo viene convertito in formato DateTime di SQL-server. Allora l'uscita data di EOMONTH () sarà 2016/12/31 avente 2016, come Anno, 12 come mese e 31 giorni. Questa uscita quando viene passato al Day () ti dà i giorni totali conteggio del mese.

Se vogliamo ottenere il risultato immediato per la verifica siamo in grado di eseguire direttamente il codice qui sotto,

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

o

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

per riferimento al lavoro in SQL Server 2005/2008/2012, si prega di seguire il seguente link esterno ...

Trova Numero giorni in un mese in SQL

Per qualsiasi 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)))

semplice query in SQLServer2012:

selezionare il giorno (( '20-05-1951 22:00:00'))

ho provato per molte date e torno sempre un risultato corretto

selezionare 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 + datediff (dd, dateadd (dd, -1 * datepart (dd, GETDATE ()) + 1, GETDATE ()), dateadd (dd, -1 * datepart (dd, dateadd (mm, 1, GETDATE ( ))), dateadd (mm, 1, GETDATE ())))

sostituire qualsiasi data con getdate per ottenere il no di mesi in quella data particolare

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

risultato: Questo mese 31

Mese Successivo 30

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top