wie wenn ich es tue
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date]
Wie kann ich den Gruppenzeitraum angeben?
MS SQL 2008
2. Bearbeiten
Ich versuche
SELECT MIN([Date]) AS RecT, AVG(Value)
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY (DATEPART(MINUTE, [Date]) / 10)
ORDER BY RecT
% 10 auf / 10 geändert. Ist es möglich, eine Datumsausgabe ohne Millisekunden durchzuführen?
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
so gemacht , dass wenn ich mir die DatenDATE(DT.[Date])
.datepart(hour, workingPolicy.workingHours)/2.0
gibt1.5
währenddatepart(hour, '1900-01-01 09:00:30.000')/2.0
gibt4.5
, ich verstehe nicht warum? Hinweis: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 . Bitte helfen SieIch bin super spät zur Party, aber dies erscheint in keiner der vorhandenen Antworten:
10
undMINUTE
Begriffe können in eine beliebige Anzahl und geändert werdenDATEPART
.DATETIME
Wert, was bedeutet: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 . †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
istSECOND
, 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.
quelle
where
Klausel vor diegroup by
./ 20 * 20
also mit dem Sammeln von Daten für Intervalle von 20 Minuten identisch sein? Entschuldigung, ich habe gerade Probleme mit Mathe.The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
). Es scheint, dass MINUTE das kleinste Datum ist, das Sie mit diesem Ansatz verwenden können.0
in'2000'
(Anführungszeichen sind wichtig!) und versuchen Sie esSECOND
erneut.In T-SQL können Sie:
oder
durch Minutengebrauch
DATEPART(mi, [Date])
oder
nach 10 Minuten verwenden
DATEPART(mi, [Date]) / 10
(wie Timothy vorgeschlagen)quelle
Für ein Intervall von 10 Minuten würden Sie
Wie schon von tzup und Pieter888 erwähnt ... nur ein Stundenintervall zu machen
quelle
Sollte so etwas sein
(Nicht 100% sicher über die Syntax - ich bin eher ein Oracle-Typ)
In Oracle:
quelle
Die ursprüngliche Antwort des Autors funktioniert ziemlich gut. Um diese Idee zu erweitern, können Sie so etwas tun
Dadurch können Sie über einen längeren Zeitraum als 60 Minuten gruppieren, z. B. 720, was einem halben Tag usw. entspricht.
quelle
Für MySql:
quelle
Meine Lösung besteht darin, mithilfe einer Funktion eine Tabelle mit den Datumsintervallen zu erstellen und diese Tabelle dann mit den Daten zu verknüpfen, die ich mithilfe des Datumsintervalls in der Tabelle gruppieren möchte. Das Datumsintervall kann dann bei der Darstellung der Daten einfach ausgewählt werden.
quelle
quelle
Für SQL Server 2012 verwende ich, obwohl ich glaube, dass es in SQL Server 2008R2 funktionieren würde, den folgenden Ansatz, um die Zeit auf die Millisekunde zu reduzieren:
Dies funktioniert durch:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
@rms = @ms % @msPerSlice
DATEADD(MILLISECOND, -@rms, time)
Da dies mit Mikrosekunden und kleineren Einheiten überläuft, müssten größere, feinere Datensätze leider einen weniger bequemen Fixpunkt verwenden.
Ich habe dies nicht rigoros bewertet und bin nicht in Big Data, daher kann Ihr Kilometerstand variieren, aber die Leistung war nicht merklich schlechter als bei den anderen Methoden, die an unseren Geräten und Datensätzen ausprobiert wurden, und die Auszahlung des Entwicklerkomforts für willkürliches Slicing macht es lohnenswert für uns.
quelle
Ersetzen Sie die beiden 600 durch eine beliebige Anzahl von Sekunden, die Sie gruppieren möchten.
Wenn Sie dies häufig benötigen und sich die Tabelle nicht ändert, wie der Name Archive andeutet, ist es wahrscheinlich etwas schneller, das Datum (und die Uhrzeit) als Unixtime in der Tabelle zu konvertieren und zu speichern.
quelle
Ich weiß, dass ich mit diesem zu spät zur Show komme, aber ich habe diesen ziemlich einfachen Ansatz verwendet. Auf diese Weise erhalten Sie die 60-Minuten-Scheiben ohne Rundungsprobleme.
quelle
quelle