Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Was ist der beste Weg, um ein Datum in SQL Server zu kürzen?

Zum Runden auf den nächsten ganzen Tag , gibt es drei Ansätze, die weit verbreitet sind. Der erste verwendet datediff um die Anzahl der Tage seit 0 zu finden Terminzeit. Die 0 datetime entspricht dem 1. Januar 1900. Indem Sie die Tagesdifferenz zum Startdatum addieren, haben Sie auf einen ganzen Tag gerundet;

select dateadd(d, 0, datediff(d, 0, getdate()))

Die zweite Methode ist textbasiert:Sie schneidet die Textbeschreibung mit varchar(10) ab , wobei nur der Datumsteil übrig bleibt:

select convert(varchar(10),getdate(),111)

Die dritte Methode nutzt die Tatsache, dass ein datetime ist eigentlich ein Fließkommawert, der die Anzahl der Tage seit 1900 darstellt. Also durch Runden auf eine ganze Zahl, zum Beispiel mit floor , erhalten Sie den Beginn des Tages:

select cast(floor(cast(getdate() as float)) as datetime)

Um Ihre zweite Frage zu beantworten, der Wochenanfang ist kniffliger. Eine Möglichkeit besteht darin, den Wochentag zu subtrahieren:

select dateadd(dd, 1 - datepart(dw, getdate()), getdate())

Dies gibt auch einen Zeitteil zurück, also müssten Sie es mit einer der Zeitstreifenmethoden kombinieren, um zum ersten Datum zu gelangen. Zum Beispiel mit @start_of_day als Variable für die Lesbarkeit:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(dd, 1 - datepart(dw, @start_of_day), @start_of_day)

Der Jahresbeginn, Monat, Stunde und Minute arbeiten immer noch mit dem "Unterschied seit 1900"-Ansatz:

select dateadd(yy, datediff(yy, 0, getdate()), 0)
select dateadd(m, datediff(m, 0, getdate()), 0)
select dateadd(hh, datediff(hh, 0, getdate()), 0)
select dateadd(mi, datediff(mi, 0, getdate()), 0)

Rundung in Sekunden erfordert einen anderen Ansatz, da die Anzahl der Sekunden seit 0 gibt Überlauf. Eine Möglichkeit, dies zu umgehen, besteht darin, den Beginn des Tages anstelle von 1900 als Referenzdatum zu verwenden:

declare @start_of_day datetime
set @start_of_day = cast(floor(cast(getdate() as float)) as datetime)
select dateadd(s, datediff(s, @start_of_day, getdate()), @start_of_day)

Zum Runden um 5 Minuten , passen Sie die Minutenrundungsmethode an. Nehmen Sie den Quotienten der Minutendifferenz, zum Beispiel mit /5*5 :

select dateadd(mi, datediff(mi,0,getdate())/5*5, 0)

Das funktioniert auch für Viertel- und Halbstunden.