6 Stimmen

Wie kann ich den letzten Tag des Monats in SQL berechnen?

Speziell MSSQL 2005.

0 Stimmen

Ich bin mir nicht sicher, ob die Antwort, die Sie als akzeptiert markiert haben, wirklich funktioniert. Lassen Sie "2009 Jan 30" durchlaufen und sehen Sie, was dabei herauskommt?

0 Stimmen

Hallo? Die akzeptierte Antwort funktioniert nicht...

0 Stimmen

Dems, ich habe dies als Inspiration für eine Lösung verwendet, die ich implementiert habe, aber das ist fast ein Jahr her, so dass ich mich nicht mehr genau erinnern kann, was ich getan habe...

18voto

Bill the Lizard Punkte 384619

Hier ist eine Lösung, die Ihnen die letzte Sekunde des aktuellen Monats anzeigt. Sie können den Datumsteil extrahieren oder ihn ändern, um nur den Tag zurückzugeben. Ich habe dies auf SQL Server 2005 getestet.

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );

Um zu verstehen, wie das funktioniert, müssen wir uns die dateadd() y datediff() Funktionen.

DATEADD(datepart, number, date)  
DATEDIFF(datepart, startdate, enddate)

Wenn Sie nur den innersten Aufruf von datediff() ausführen, erhalten Sie die aktuelle Monatszahl seit Zeitstempel 0.

select datediff(m, 0, getdate() );  
1327

Der nächste Teil addiert diese Anzahl von Monaten plus 1 zum Zeitstempel 0, so dass Sie den Beginn des nächsten Kalendermonats erhalten.

select dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 );
2010-09-01 00:00:00.000

Die äußere Funktion dateadd() schließlich subtrahiert einfach eine Sekunde vom Anfangszeitstempel des nächsten Monats und liefert die letzte Sekunde des aktuellen Monats.

select dateadd( s, -1, dateadd( mm, datediff( m, 0, getdate() ) + 1, 0 ) );
2010-08-31 23:59:59.000

Diese alte Antwort (unten) hat einen Fehler, bei dem sie am letzten Tag eines Monats, der mehr Tage hat als der nächste Monat, nicht funktioniert. Ich lasse sie hier als Warnung für andere.

Addieren Sie einen Monat zum aktuellen Datum und subtrahieren Sie dann den von der Funktion DAY zurückgegebenen Wert, den Sie mit den Funktionen DAY und DATEADD auf das aktuelle Datum anwenden.

dateadd(day, -day(getdate()), dateadd(month, 1, getdate()))

0 Stimmen

Was ist, wenn die beiden getdate-Aufrufe Antworten mit unterschiedlichen Daten liefern?

0 Stimmen

Ich nehme an, dass das möglich ist. Sie müssten vorher eine Variable deklarieren, die das heutige Datum enthält.

0 Stimmen

Das werden sie nicht. Wir erstellen Berichte, die Spalten für Jahr, Quartal, Monat und Datum (GetDate()) generieren, was 30 Sekunden dauert, und der Wert ändert sich nie.

4voto

onedaywhen Punkte 52850
SELECT DATEADD(M, DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP), '1990-01-31T00:00:00.000')

Erläuterung:

Allgemeiner Ansatz: Verwendung zeitlicher Funktionen.

SELECT '1990-01-01T00:00:00.000', '1990-01-31T00:00:00.000'

Dabei handelt es sich um DATETIME-Literale, die das erste Zeitgranulat am ersten Tag bzw. am letzten Tag desselben 31-Tage-Monats darstellen. Welcher Monat gewählt wird, ist völlig willkürlich.

SELECT DATEDIFF(M, '1990-01-01T00:00:00.000', CURRENT_TIMESTAMP)

Dies ist die Differenz in ganzen Monaten zwischen dem ersten Tag des Referenzmonats und dem aktuellen Zeitstempel. Nennen wir dies @calc .

SELECT DATEADD(M, @calc, '1990-01-31T00:00:00.000')

Dies fügt hinzu @calc Das Ergebnis ist der aktuelle Zeitstempel, der auf den letzten Tag seines Monats "gerundet" ist. Q.E. D.

3voto

sebagomez Punkte 9211

Versuchen Sie dies:

DATEADD (DAY, -1, DATEADD (MONTH, DATEDIFF (MONTH, 0, CURRENT_TIMESTAMP) + 1, 0)

1 Stimmen

Ich habe oft festgestellt, dass die Leute dieser Logik nicht folgen können. Obwohl es also richtig zu sein scheint (wobei die akzeptierte Antwort nicht richtig zu sein scheint), werde ich nicht +1 geben. Besteht die Möglichkeit, dass Sie die Antwort bearbeiten und die Erklärung hinzufügen?

2voto

Taherul Punkte 21

Die wichtigsten Punkte sind, ob Sie den ersten Tag des aktuellen Monats, den letzten Tag des letzten Monats und den letzten Tag des aktuellen Monats erhalten können.

Im Folgenden finden Sie eine schrittweise Anleitung zum Schreiben von Abfragen:

In SQL Server beginnt das Datum mit dem Jahr 1901/01/01 (Datum 0) und bis heute kann jeder Monat durch eine Zahl identifiziert werden. Monat 12 ist der erste Monat des Jahres 1902, also Januar. Monat 1200 ist der Januar des Jahres 2001. In ähnlicher Weise kann jeder Tag mit einer eindeutigen Nummer versehen werden, z.B. Datum 0 ist 1901/01/01. Das Datum 31 ist 1901/02/01, da der Januar des Jahres 1901 mit 0 beginnt.

So finden Sie den ersten Tag des aktuellen Monats (aktuelles Datum oder ein bestimmtes Datum)

  1. Zunächst müssen wir prüfen, wie viele Monate seit dem Datum 0 (1901/01/01) vergangen sind. SELECT DATEDIFF(MM,0,GETDATE())
  2. Gleiche Monatszahl zum Datum hinzufügen 0(1901/01/01)

    SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE()),0)

Dann erhalten wir den ersten Tag des aktuellen Monats (Aktuelles Datum oder ein bestimmtes Datum)

Um den letzten Tag des letzten Monats zu erhalten

Wir müssen eine Sekunde vom ersten Tag des aktuellen Monats subtrahieren

SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,0,GETDATE()),0))

So erhalten Sie den letzten Tag des aktuellen Monats

Um den ersten Tag des aktuellen Monats zu ermitteln, haben wir zunächst geprüft, wie viele Monate seit dem Datum 0(1901/01/01) vergangen sind. Wenn wir einen weiteren Monat mit der Gesamtzahl der Monate seit Datum 0 hinzufügen und dann die Gesamtzahl der Monate mit Datum 0 addieren, erhalten wir den ersten Tag des nächsten Monats.

SELECT DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0)

Wenn wir den ersten Tag des nächsten Monats erhalten, müssen wir nur eine Sekunde abziehen, um den letzten Tag des aktuellen Monats zu erhalten.

SELECT DATEADD(SS,-1,DATEADD(MM, DATEDIFF(MM,0,GETDATE())+1,0))

Ich hoffe, das hilft.

1voto

Ragul Punkte 476

Mit SQL2005 haben Sie keinen Zugang zu einer hilfreichen Funktion EOMONTH() Sie müssen dies also selbst berechnen.

Diese einfache Funktion funktioniert ähnlich wie EOMONTH

CREATE FUNCTION dbo.endofmonth(@date DATETIME= NULL)
RETURNS DATETIME
BEGIN
RETURN DATEADD(DD, -1, DATEADD(MM, +1, DATEADD(DD, 1 - DATEPART(DD, ISNULL(@date,GETDATE())), ISNULL(@date,GETDATE()))))
END

Abfrage durchführen:

SELECT dbo.endofmonth(DEFAULT)  --Current month-end date
SELECT dbo.endofmonth('02/25/2012') --User-defined month-end date

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X