it-swarm.dev

Wie ermitteln Sie die Anzahl der Tage in einem Monat in SQL Server?

Ich muss die Anzahl der Tage in einem Monat für ein bestimmtes Datum in SQL Server ermitteln.

Gibt es eine eingebaute Funktion? Wenn nicht, was soll ich als benutzerdefinierte Funktion verwenden?

79
Even Mien

Sie können am ersten Tag des angegebenen Monats Folgendes verwenden:

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

Damit es für jedes Datum funktioniert:

datediff(day, dateadd(day, 1-day(@date), @date),
              dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
107
Mehrdad Afshari

In SQL Server 2012 können Sie mit EOMONTH (Transact-SQL) den letzten Tag des Monats abrufen. Anschließend können Sie mit DAY (Transact-SQL) die Anzahl der Tage im Monat ermitteln.

DECLARE @ADate DATETIME

SET @ADate = GETDATE()

SELECT DAY(EOMONTH(@ADate)) AS DaysInMonth
126
Mikael Eriksson

Die eleganteste Lösung: funktioniert für jedes @DATE

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

Werfen Sie es in eine Funktion oder verwenden Sie es einfach inline. Dies beantwortet die ursprüngliche Frage ohne all den zusätzlichen Müll in den anderen Antworten.

beispiele für Daten aus anderen Antworten:

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

Viel einfacher ... versuchen Sie 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)))

Ich persönlich würde jedoch eine UDF dafür erstellen, wenn es keine eingebaute Funktion gibt ...

11
Brimstedt

Ich würde vorschlagen:

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

Dieser Code liefert die Anzahl der Tage im aktuellen Monat:

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

Ändern Sie getdate() in das Datum, für das Sie Tage zählen müssen.

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

Nizza Einfach und erfordert keine Funktionen

1
pradeep

Sie müssen eine Funktion erstellen, diese dient jedoch zu Ihrer eigenen Bequemlichkeit. Es funktioniert perfekt und ich bin nie auf fehlerhafte Berechnungen gestoßen, die diese Funktion verwenden.

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

Wie es funktioniert: Wenn Sie die Tagesnummer des Datums vom Datum selbst abziehen, erhalten Sie den letzten Tag des vorherigen Monats. Sie müssen also dem angegebenen Datum einen Monat hinzufügen, die Tageszahl abziehen und die Tageskomponente des Ergebnisses erhalten.

1
an40us

Lösung 1: Finden Sie die Anzahl der Tage in dem Monat, in dem wir uns gerade befinden

DECLARE @dt datetime
SET     @dt = getdate()

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

Lösung 2: Finden Sie die Anzahl der Tage in einer bestimmten Monats-Jahres-Kombination

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

Sie müssen eine Funktion hinzufügen, aber es ist eine einfache Funktion. Ich benutze das:

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
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 und erfordert keine Funktionen

0
Paul
DECLARE  @m int
SET     @m = 2

SELECT 
       @m AS [Month],
       DATEDIFF(DAY,
                DATEADD(DAY, 0, DATEADD(m, [email protected] -1, 0)),
                DATEADD(DAY, 0, DATEADD(m,+ @m, 0))
               ) AS [Days in Month]
0
Danyil Vlasov

hier ist ein anderes... 

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

Ich weiß, dass diese Frage alt ist, aber ich dachte, ich würde mitteilen, was ich verwende.

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

und

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

Diese könnten kombiniert werden, um eine einzelne Funktion zu erstellen, um bei Bedarf die Anzahl der Tage eines Monats abzurufen.

0
DanielM

Die Antwort von Mehrdad Afshari ist am genauesten, abgesehen von der üblichen Antwort basiert diese Antwort auf dem formalen mathematischen Ansatz, den Curtis McEnroe in seinem Blog https://cmcenroe.me/2014/12/05/05/days-in-month-formula gegeben hat. 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

Um das Nein zu bekommen Von Tagen in einem Monat können wir Day () direkt in SQL verwenden.

Folgen Sie dem Link am Ende meiner Antwort zu SQL Server 2005/2008.

Das folgende Beispiel und das Ergebnis stammen aus 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')

Ergebnis in SQL Server SSMS

  (no column name)
1 31

Verarbeiten:

Bei Verwendung von EOMONTH wird das Datumsformat, das wir verwenden, in das DateTime-Format des SQL-Servers konvertiert. Die Ausgabe des Datums von EOMONTH () ist dann 2016-12-31 und hat 2016 als Jahr, 12 als Monat und 31 als Tage . Diese Ausgabe, wenn sie an Tag () übergeben wird, gibt die Gesamtzahl der Tage im Monat an.

Wenn wir das sofortige Ergebnis zur Überprüfung erhalten möchten, können Sie den folgenden Code direkt ausführen.

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

oder

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

um auf die Arbeit in SQL Server 2005/2008/2012 zu verweisen, folgen Sie bitte dem folgenden externen Link ...

Finden Sie die Anzahl der Tage in einem Monat in 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

Ich habe Mehrdad angehoben, aber das funktioniert auch. :)

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

Zu testen

declare @testDT datetime;

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

select dbo.GetDaysInMonth(@testDT)
0
feihtthief