Speziell MSSQL 2005.
Was ist, wenn die beiden getdate-Aufrufe Antworten mit unterschiedlichen Daten liefern?
Speziell MSSQL 2005.
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()))
Ich nehme an, dass das möglich ist. Sie müssten vorher eine Variable deklarieren, die das heutige Datum enthält.
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.
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.
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?
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)
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.
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 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.
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...
0 Stimmen
Wow, ich habe gerade das "2008" bemerkt. Ich habe KEINE Ahnung, wie ich diese Frage gefunden habe, es sei denn, SO hat die Reihenfolge der Auflistung der "neuen" Fragen ein wenig durcheinander gebracht.
0 Stimmen
@Dems: Du hast Recht, meine alte Lösung hatte einen Fehler. Ich habe sie auf eine bessere Lösung aktualisiert, die nicht den gleichen Fehler hat.