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
10
und MINUTE
Begriffe können in eine beliebige Anzahl und geändert werdenDATEPART
.
- Es ist ein
DATETIME
Wert, was bedeutet:
- Es funktioniert gut über lange Zeitintervalle. (Es gibt keine Kollision zwischen den Jahren.)
- Wenn Sie es in die
SELECT
Anweisung 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 DATEPART
ist 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) * 5
so gemacht , dass wenn ich mir die Daten