2 Stimmen

Was ist die einfachste und effizienteste Methode, um das erste und letzte Datum des Vormonats zu ermitteln?

Ich versuche, den ersten und letzten Tag des Vormonats zu ermitteln. Was ich wirklich brauche, ist ein Bereich für eine BETWEEN Klausel, also brauche ich die erste Sekunde des ersten Tages und die letzte Sekunde des letzten Tages.

Dies ist der Code, den ich verwendet habe:

set @startDate = DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm, -1, getdate())), 0)
set @endDate = dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()  ), 0))

Für den heutigen Tag bedeutet dies jedoch, dass der 1.4.2011 und der 1.5.2011 zurückgegeben werden, was nicht ganz korrekt ist. Ich möchte die letzte Sekunde des 30.4.2011 für das endDate erhalten.

Ich habe gegoogelt und sehe viele verschiedene Möglichkeiten, den ersten und letzten Tag eines Monats zu ermitteln. Sogar auf SO selbst sehe ich viele verschiedene Varianten dieser Frage mit vielen verschiedenen Antworten. Ich würde gerne eine Liste aller Methoden zusammenstellen, um dies zu erreichen, und dann bestimmen, welche die "beste" ist (basierend auf Einfachheit und Effizienz)

(Ich sollte hinzufügen, dass ich Sql Server 2000 verwende)

EDIT :

Bezüglich des Enddate-Fehlers - dieser Code ist eigentlich korrekt, das Problem war nur, dass @endDate war eine kleine Zeitspanne. Ich habe es in ein datetime geändert und es funktioniert jetzt richtig

4voto

MatBailie Punkte 77040

Für Daten empfehle ich dringend, nicht zu verwenden BETWEEN . Dies wird dadurch verdeutlicht, dass Sie 3 ms von einem Datum abziehen müssen, um "den letzten Moment des Vortages" zu erhalten.

Bei kontinuierlichen Werten (anstelle von diskreten Werten), die unterschiedliche Genauigkeitsgrade haben können, ist es im Allgemeinen besser, die >= AND < . Zum Beispiel...

WHERE myDateField >= '2012-04-01' AND myDateField < '2012-05-01'

Auf diese Weise müssen Sie sich nicht einmal Gedanken über die Genauigkeit der myDateField Daten oder Datentyp. Es funktioniert einfach. Immer.

In diesem Sinne ist Ihr Code sehr nahe an dem, was ich verwenden würde...

SET @start = DATEADD(month, DATEDIFF(month, 0, getDate()) - 1, 0)
SET @end   = DATEADD(month, DATEDIFF(month, 0, getDate())    , 0)

0voto

Murtaza Punkte 3015

EDIT: gemäß der Erklärung von @Dems (siehe die Kommentare)

Ich denke, meine Antwort wird die gleiche sein wie die von @Dems, denn wir haben beide die gleichen Antworten :) @Dems Kredit geht an Sie.

Probieren Sie diese Abfrage aus, dann erhalten Sie die richtigen Daten für Ihren Bedarf.

select DATEADD(mm, DATEDIFF(mm,0,DATEADD(mm, -1, GETDATE())), 0)
select DATEADD(mm, DATEDIFF(mm,0,GETDATE()  ), 0)

und mit diesem Datum können Sie direkt die >= and < gemäß dem Vorschlag von @Dems unten.

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