2017-10-12 3 views
1

Es ist möglich, einfache Gruppierung von n Stunden? Ich habe verwandte Fragen für Minuten gefunden, aber ich kann es nicht mit Stunden tun.T-Sql Group von n Stunden

Ich muss einige Daten um 8 Stunden mit Offset gruppieren.

Also die ersten 8 Stunden sind nicht 00:00 - 08:00, sondern 22:00 (gestern) - 06:00 (heute).

Ich gruppierte dies nach Stunden und stecken. Wie kann ich das tun? Jeder Rat wird geschätzt.

Antwort

2

Sie können den DATEADD/DATEDIFF-Trick verwenden, um nach 8-Stunden-Intervallen zu gruppieren.

Sie benötigen eine obwohl Offset hinzuzufügen, in diesem Fall

  • In 2 Stunden von 22.30 bis 00.30 Uhr zu verschieben. Oder 07.30 zurück bis 09:30
  • Gruppe durch das 8-Stunden-Intervall (0-8, 8-16, 8-24)
  • Subtract 2 die abgerundeten 00.00 bis 22:00 zurück zu verschieben, oder die abgerundete 08:00 zu 06:00

Beispiel Skript

DECLARE @foo table (foo smalldatetime, bar int); 

INSERT @foo (foo, bar) 
VALUES 
    ('2017-10-11 21:00', 1), 
    ('2017-10-11 22:00', 2), 
    ('2017-10-11 23:00', 3), 
    ('2017-10-12 01:00', 4), 
    ('2017-10-12 03:00', 5), 
    ('2017-10-12 05:00', 6), 
    ('2017-10-12 07:00', 7), 
    ('2017-10-12 08:00', 8); 

SELECT 
    SUM(bar), 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0) 
FROM 
    @foo 
GROUP BY 
    DATEADD(hh, ((DATEDIFF(hh, 0, foo)+2)/8*8)-2, 0); 
+0

Vielen Dank für Ihre Hilfe – Bogu

0

ich weiß nicht, weder Daten, Eingang noch Ausgang (die Sie zur Verfügung stellen sollte), aber hier einige allgemeine Art und Weise:

angenommen, wir haben eine einfache Tabelle (mit dem Namen SimpleTable) mit 2 Spalten: Zeit der Verkauf von Produkten und verkaufte Menge:

SellingTime    | Quantity 
2013-01-02 08:43:22.011 | 4 
2013-02-12 12:32:12.001 | 14 
etc. 

Nun wird fügen wir die Nummer der Bestellung an für jedes Datum: 1 für die Zeit zwischen 22-6 usw.

SELECT SellingTime, Qunatity, 
     CASE WHEN DATEPART(hh, SellingTime) >= 22 AND DATEPART(hh, SellingTime) < 6 THEN 1 
      WHEN DATEPART(hh, SellingTime) >= 6 AND DATEPART(hh, SellingTime) < 14 THEN 2 
      ELSE 3 END AS NumberOfOrder 
FROM SimpleTable 

Jetzt von NumberOfOrder und Summe, alles, was Sie Gruppe tun müssen, ist zu Quantity:

SELECT NumberOfOrder, SUM(Quantity) FROM (*) 

wo anstelle von * Sie erste Abfrage setzen.