Benutzer mit den meisten Antworten
Datetime beliebig abrunden

Frage
-
Hallo zusammen,
in PostgeSQL gibt es die schöne Funktion date_trunc() welche es ermöglicht DATETIME Werte nach Tag, Stunde, Minute, etc. ab zu runden.
Gibt es so eine Funtion auch für SQL Server?
Das es ohne Probleme möglich ist (mit SQL Server) auf den Tag um 00:00:00 zu runden ist mir bewusst. Ich benötige jeddoch auch das Runden auf Stunden und Minuten. Das am besten auch noch kompakt in einer Funktion, damit ich diese dann je nach Aktion aufrunden und den Befehl "runde auf Stunde/Minute/etc" mitgeben kann.
Habe bis jetzt leider nichts hilfreiches gefunden. Ich hoffe ihr könnt mir weiter helfen.
Vielen Dank!!!
- Bearbeitet leMarvin91 Montag, 10. September 2012 09:01
Antworten
-
Hallo,
Mit etwas rumrechnen kann man das auch erreichen.
Z.B. nimmst Du den 01.01. als Basis und rechnest immer die Differenz in Stunden, Minuten oder Sekunden auf den Wert:
DECLARE @date datetime = {ts N'2012-09-10 12:34:56.788'} DECLARE @base datetime = {d N'2012-01-01'}; SELECT @date ,DATEADD(DAY, DATEDIFF(DAY, @base, @date), @base) AS Tag ,DATEADD(HOUR, DATEDIFF(HOUR, @base, @date), @base) AS Stunde ,DATEADD(MINUTE, DATEDIFF(MINUTE, @base, @date), @base) AS Minute ,DATEADD(SECOND, DATEDIFF(SECOND, @base, @date), @base) AS Sekunde
- Als Antwort markiert Raul TalmaciuMicrosoft contingent staff Donnerstag, 13. September 2012 12:58
-
Kann ich die Query nun so abändern, dass anstatt der stündlichen Intervalle z.B. 3 stündliche Intervalle genommen werden?
Eine merkwürdige Anforderung, aber mit einer einfach Berechnung ist auch das problemlos zu lösen: Man ermittelt erst mal separat die Differenz zur Basis in Stunden, von der zieht man den Modulo 3 Wert ab und addiert das Ergebnis wieder auf die Basis; fertig:
DECLARE @base datetime = {d N'2012-01-01'}; DECLARE @tbl TABLE(datum datetime); INSERT INTO @tbl VALUES ({ts N'2011-04-14 12:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 13:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 14:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 15:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 16:00:00.000'}); ;WITH tbl AS (SELECT datum ,DATEDIFF(HOUR, @base, datum) AS HourDiff FROM @tbl) SELECT datum ,DATEADD(HOUR, HourDiff - (HourDiff % 3), @base) AS Hour3Intervall FROM tbl
- Als Antwort markiert Raul TalmaciuMicrosoft contingent staff Donnerstag, 13. September 2012 12:58
Alle Antworten
-
Hallo,
Mit etwas rumrechnen kann man das auch erreichen.
Z.B. nimmst Du den 01.01. als Basis und rechnest immer die Differenz in Stunden, Minuten oder Sekunden auf den Wert:
DECLARE @date datetime = {ts N'2012-09-10 12:34:56.788'} DECLARE @base datetime = {d N'2012-01-01'}; SELECT @date ,DATEADD(DAY, DATEDIFF(DAY, @base, @date), @base) AS Tag ,DATEADD(HOUR, DATEDIFF(HOUR, @base, @date), @base) AS Stunde ,DATEADD(MINUTE, DATEDIFF(MINUTE, @base, @date), @base) AS Minute ,DATEADD(SECOND, DATEDIFF(SECOND, @base, @date), @base) AS Sekunde
- Als Antwort markiert Raul TalmaciuMicrosoft contingent staff Donnerstag, 13. September 2012 12:58
-
Hallo!
Ich gehe mal davon aus, dass Du nicht runden meinst, sondern abschneiden. Dann sollte das hier helfen:
Select GETDATE() as Datum_Zeit, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) , 0) AS [Datum], DATEADD(HOUR, DATEDIFF(HOUR, 0, GETDATE()) , 0) AS [Datum_Stunde], DATEADD(MINUTE, DATEDIFF(MINUTE, 0, GETDATE()) , 0) AS [Datum_Minute], DATEADD(MILLISECOND, -DATEPART(MILLISECOND, GETDATE()) , GETDATE()) AS [Datum_Sekunde] ;
Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
www.insidesql.org/blogs/cmu -
Ja abrunden oder abschneiden :D
Die Lösung von Olaf funktioniert einwandfrei
Werde bei Gelgenheit den Vorschlag von Christoph auch mal testen.
VIELEN DANK!
Eine letzte Frage habe ich noch.
Meine Query seiht jetzt wie folgt aus
DECLARE @base datetime = {d N'2010-01-01'}; SELECT TOP 1000 DATEADD(HOUR, DATEDIFF(HOUR, @base, start_time), @base) AS leStunde , sum(execution_time) FROM [nagios_perfdata].[dbo].[servicechecks] where service_object_id = 333 group by (DATEADD(HOUR, DATEDIFF(HOUR, @base, start_time), @base)) order by leStunde
mit der Ausgabe:
leStunde (No column name) 2011-04-14 12:00:00.000 0,0765099991112947 2011-04-14 13:00:00.000 0,254530001431704 2011-04-14 14:00:00.000 0,272189997136593 2011-04-14 15:00:00.000 0,307109996676445 2011-04-14 16:00:00.000 0,254429997876287
Kann ich die Query nun so abändern, dass anstatt der stündlichen Intervalle z.B. 3 stündliche Intervalle genommen werden?
Dann wäre alles perfekt :)
- Bearbeitet leMarvin91 Montag, 10. September 2012 10:07
-
Kann ich die Query nun so abändern, dass anstatt der stündlichen Intervalle z.B. 3 stündliche Intervalle genommen werden?
Eine merkwürdige Anforderung, aber mit einer einfach Berechnung ist auch das problemlos zu lösen: Man ermittelt erst mal separat die Differenz zur Basis in Stunden, von der zieht man den Modulo 3 Wert ab und addiert das Ergebnis wieder auf die Basis; fertig:
DECLARE @base datetime = {d N'2012-01-01'}; DECLARE @tbl TABLE(datum datetime); INSERT INTO @tbl VALUES ({ts N'2011-04-14 12:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 13:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 14:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 15:00:00.000'}); INSERT INTO @tbl VALUES ({ts N'2011-04-14 16:00:00.000'}); ;WITH tbl AS (SELECT datum ,DATEDIFF(HOUR, @base, datum) AS HourDiff FROM @tbl) SELECT datum ,DATEADD(HOUR, HourDiff - (HourDiff % 3), @base) AS Hour3Intervall FROM tbl
- Als Antwort markiert Raul TalmaciuMicrosoft contingent staff Donnerstag, 13. September 2012 12:58