T-SQL-Datums- und Uhrzeitangaben werden mithilfe von Funktionen auf die nächste Minute und die nächsten Stunden gerundet

113

In SQL Server 2008 möchte ich, dass die Datum / Uhrzeit-Spalte auf die nächste Stunde und die nächste Minute gerundet wird, vorzugsweise mit vorhandenen Funktionen im Jahr 2008.

Für diesen Spaltenwert 2007-09-22 15:07:38.850sieht die Ausgabe folgendermaßen aus:

2007-09-22 15:08 -- nearest minute
2007-09-22 15    -- nearest hour
user219628
quelle
6
Sollte das Beispiel für die nächste Minute nicht 15:08 sein? Weil Sekunden in einer Minute 60 sind ...
OMG Ponies
Haben Sie diesen Fehler absichtlich nicht korrigiert, als Sie seine Frage bearbeitet haben, damit Sie diesen Kommentar abgeben können?
Herr Mittwoch,
@ MrWednesday Sie stellen fest, dass zwischen der Bearbeitung und diesem Kommentar mehr als 10 Minuten liegen. Ich würde mir vorstellen, dass der Gedanke danach kam.
lc.

Antworten:

208
declare @dt datetime

set @dt = '09-22-2007 15:07:38.850'

select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)

wird zurückkehren

2007-09-22 15:07:00.000
2007-09-22 15:00:00.000

Das Obige schneidet nur die Sekunden und Minuten ab und erzeugt die in der Frage angeforderten Ergebnisse. Wie @OMG Ponies hervorhob, können Sie, wenn Sie auf- und abrunden möchten, eine halbe Minute bzw. eine halbe Stunde hinzufügen und dann abschneiden:

select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)

und du wirst bekommen:

2007-09-22 15:08:00.000
2007-09-22 15:00:00.000

Vor dem Datum Datentyp in SQL Server 2008 hinzugefügt wurde, würde ich das obige Verfahren verwenden , um den Zeitabschnitt aus einem Datumzeit zu verkürzen nur das Datum zu erhalten. Die Idee ist, die Anzahl der Tage zwischen der fraglichen Datumszeit und einem festen Zeitpunkt ( 0der implizit gilt) zu bestimmen 1900-01-01 00:00:00.000:

declare @days int
set @days = datediff(day, 0, @dt)

und fügen Sie dann diese Anzahl von Tagen zum festen Zeitpunkt hinzu, wodurch Sie das ursprüngliche Datum mit der Uhrzeit erhalten, die auf Folgendes eingestellt ist 00:00:00.000:

select dateadd(day, @days, 0)

oder prägnanter:

select dateadd(day, datediff(day, 0, @dt), 0)

Die Verwendung eines anderen Datumsteil (zB hour, mi) wird entsprechend arbeiten.

Jeff Ogata
quelle
2
Ich bezweifle, dass jemand anderes darauf stoßen wird, aber wenn Sie versuchen, auf die nächste Sekunde aufzurunden und 500 Millisekunden zu addieren, sollten Sie datiert machen (zweite, '1/1/2000', .... vs datiert (Sekunde, 0 ... da Sie einen Überlauffehler erhalten. Sekunden von 0 sind zu groß, denke ich.
Eric Twilegar
'Addiere die Anzahl der Stunden seit dem 1. Januar 1900 bis zum 1. Januar 1900' - Ich habe dies in Java / SQL festgestellt, wo es hässlich aussieht. In meinem Fall hätte es wirklich auf der Java-Seite gemacht werden sollen.
Corwin Newall
Für Berechnungen mit datetimeoffset, musste ich ersetzen 0mit TODATETIMEOFFSET('1900-01-01 00:00:00', 0)zu vermeiden zwingt die lokale Zeitzone auf das Ergebnis.
krlmlr
26

"Abgerundet" wie in Ihrem Beispiel. Dies gibt einen varchar-Wert des Datums zurück.

DECLARE @date As DateTime2
SET @date = '2007-09-22 15:07:38.850'

SELECT CONVERT(VARCHAR(16), @date, 120) --2007-09-22 15:07
SELECT CONVERT(VARCHAR(13), @date, 120) --2007-09-22 15
Magnus
quelle
Konvertieren Sie den varchar zurück in datetime könnte (für Stunde) tun:CONVERT(datetime, CONVERT(VARCHAR(13), @date, 120)+':00:00')
Decula
10

Mir ist klar, dass diese Frage uralt ist und es eine akzeptierte und eine alternative Antwort gibt. Mir ist auch klar, dass meine Antwort nur die Hälfte der Frage beantwortet, aber für alle, die auf die nächste Minute runden möchten und dennoch einen datetime-kompatiblen Wert mit nur einer Funktion haben möchten :

CAST(YourValueHere as smalldatetime);

Verwenden Sie für Stunden oder Sekunden die Antwort von Jeff Ogata (die akzeptierte Antwort) oben.

Andrew Steitz
quelle
1
Ausgezeichnete Antwort, ich habe überprüft, dass es rund und nicht nur abgeschnitten ist. Für alle anderen, die diese Option smalldatetime
prüfen
Dies ist die beste Option, wenn Sie einige Daten in Ihrer Tabelle korrigieren müssen, für die nur eine minutengenaue Auszeit erforderlich ist.
Verschlüsselung
-1

Select convert(char(8), DATEADD(MINUTE, DATEDIFF(MINUTE, 0, getdate), 0), 108) as Time

rundet Sekunden auf 00 ab

Jam_Jam
quelle
Sehr langsam und rundet nicht ab, wie der OP es verlangt, sondern rundet ab, worum er nicht gebeten hat. (Haftungsausschluss - Ich habe Sie nicht herabgestimmt)
Reversed Engineer