Ich bin super spät zur Party, aber dies erscheint in keiner der vorhandenen Antworten:
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
- Die
10und MINUTEBegriffe können in eine beliebige Anzahl und geändert werdenDATEPART .
- Es ist ein
DATETIMEWert, was bedeutet:
- Es funktioniert gut über lange Zeitintervalle. (Es gibt keine Kollision zwischen den Jahren.)
- Wenn Sie es in die
SELECTAnweisung aufnehmen, erhält Ihre Ausgabe eine Spalte mit hübscher Ausgabe, die auf der von Ihnen angegebenen Ebene abgeschnitten ist.
'2000'ist ein "Ankerdatum", um das SQL die Datumsberechnung ausführt. Jereonh hat unten festgestellt , dass beim Auftreten der0 letzten Daten nach Sekunden oder Millisekunden ein ganzzahliger Überlauf mit dem vorherigen Anker ( ) auftritt . †
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
AS [date_truncated],
COUNT(*) AS [records_in_interval],
AVG(aa.[value]) AS [average_value]
FROM [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]
Wenn Ihre Daten Spannweiten Jahrhunderte ‡ mit einem einzigen Anker Datum für Zweit- oder Millisekunden Gruppierung werden nach wie vor dem Überlauf auftreten. In diesem Fall können Sie jede Zeile bitten, den Binning-Vergleich mit der Mitternacht ihres eigenen Datums zu verankern:
Verwenden Sie DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)statt '2000'wo immer es oben erscheint. Ihre Anfrage ist völlig unlesbar, funktioniert aber.
Eine Alternative könnte CONVERT(DATETIME, CONVERT(DATE, aa.[date]))der Ersatz sein.
† 2 32 ≈ 4,29E + 9. Wenn dies der Fall DATEPARTist SECOND, erhalten Sie auf beiden Seiten 4,3 Milliarden Sekunden oder "Anker ± 136 Jahre". In ähnlicher Weise sind 2 32 Millisekunden ≈ 49,7 Tage.
‡ Wenn Ihre Daten tatsächlich Jahrhunderte oder Jahrtausende umfassen und immer noch auf die Sekunde oder Millisekunde genau sind… herzlichen Glückwunsch! Was auch immer Sie tun, machen Sie weiter.
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5so gemacht , dass wenn ich mir die Daten