Come raggruppare il tempo per ora o per 10 minuti

come quando lo faccio

SELECT [Date] FROM [FRIIB].[dbo].[ArchiveAnalog] GROUP BY [Date] 

come posso specificare il periodo di gruppo?

MS SQL 2008

2a modifica

sto provando

 SELECT MIN([Date]) AS RecT, AVG(Value) FROM [FRIIB].[dbo].[ArchiveAnalog] GROUP BY (DATEPART(MINUTE, [Date]) / 10) ORDER BY RecT 

cambiato da% 10 a / 10. E ‘ansible rendere l’output della Data senza millisecondi?

finalmente fatto

 GROUP BY DATEPART(YEAR, DT.[Date]), DATEPART(MONTH, DT.[Date]), DATEPART(DAY, DT.[Date]), DATEPART(HOUR, DT.[Date]), (DATEPART(MINUTE, DT.[Date]) / 10) 

Sono in ritardo fino alla festa, ma questo non appare in nessuna delle risposte esistenti:

 group by dateadd(minute, datediff(minute, 0, DT.[Date]) / 10 * 10, 0) 
  • I termini di 10 e minute possono essere modificati rispettivamente per numero e datepart .
  • È un valore datetime , che significa:
    • Funziona bene su lunghi intervalli di tempo (nessuna collisione tra anni o qualsiasi cosa).
    • Includendolo nell’istruzione select si ottiene una colonna con output abbastanza troncato al livello specificato.
 SELECT dateadd(minute, datediff(minute, 0, AA.[Date]) / 10 * 10, 0) as [Date_Truncated], count(*) as [Records_in_Interval], avg(Value) as [Average_Value] FROM [FRIIB].[dbo].[ArchiveAnalog] as AA GROUP BY dateadd(minute, datediff(minute, 0, AA.[Date]) / 10 * 10, 0) ORDER BY [Date_Truncated] 

In T-SQL puoi:

 SELECT [Date] FROM [FRIIB].[dbo].[ArchiveAnalog] GROUP BY [Date], DATEPART(hh, [Date]) 

o

per minuto usa DATEPART(mi, [Date])

o

di 10 minuti usa DATEPART(mi, [Date]) / 10 (come suggerito da Timothy)

Per un intervallo di 10 minuti, lo faresti

 GROUP BY (DATEPART(MINUTE, [Date]) / 10) 

Come è già stato detto da Tzup e Pieter888 … per fare un intervallo di un’ora, giusto

 GROUP BY DATEPART(HOUR, [Date]) 

La risposta originale l’autore ha dato opere piuttosto bene. Solo per estendere questa idea, puoi fare qualcosa di simile

 group by datediff(minute, 0, [Date])/10 

che ti consentirà di raggruppare per un periodo più lungo di 60 minuti, ad esempio 720, che è mezza giornata ecc.

Dovrebbe essere qualcosa di simile

 select timeslot, count(*) from ( select datepart('hh', date) timeslot FROM [FRIIB].[dbo].[ArchiveAnalog] ) group by timeslot 

(Non sono sicuro al 100% della syntax – Sono più un tipo di tipo Oracle)

In Oracle:

 SELECT timeslot, COUNT(*) FROM ( SELECT to_char(l_time, 'YYYY-MM-DD hh24') timeslot FROM ( SELECT l_time FROM mytab ) ) GROUP BY timeslot 

Per MySql:

 GROUP BY DATE(`your_date_field`), HOUR(`your_date_field`), FLOOR( MINUTE(`your_date_field`) / 10); 

La mia soluzione è usare una funzione per creare una tabella con gli intervalli di data e poi unire questa tabella ai dati che voglio raggruppare usando l’intervallo di date nella tabella. L’intervallo di date può quindi essere facilmente selezionato durante la presentazione dei dati.

 CREATE FUNCTION [dbo].[fn_MinuteIntervals] ( @startDate SMALLDATETIME , @endDate SMALLDATETIME , @interval INT = 1 ) RETURNS @returnDates TABLE ( [date] SMALLDATETIME PRIMARY KEY NOT NULL ) AS BEGIN DECLARE @counter SMALLDATETIME SET @counter = @startDate WHILE @counter <= @endDate BEGIN INSERT INTO @returnDates VALUES ( @counter ) SET @counter = DATEADD(n, @interval, @counter) END RETURN END 

Per SQL Server 2012, sebbene ritenga che funzioni in SQL Server 2008R2, utilizzo il seguente approccio per ridurre il time slice al millisecondo:

 DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time) 

Funziona da:

  • Ottenere il numero di millisecondi tra un punto fisso e il tempo target:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • Prendendo il resto della divisione di quei millisecondi in fasce temporali:
    @rms = @ms % @msPerSlice
  • Aggiunta del negativo di quel resto al tempo target per ottenere il tempo della sezione:
    DATEADD(MILLISECOND, [email protected], time)

Sfortunatamente, come questo overflow di microsecondi e unità più piccole, i set di dati più grandi e più fini richiederebbero un punto fisso meno conveniente.

Non ho rigorosamente messo a confronto questo parametro e non sono in grande formato, quindi il tuo chilometraggio può variare, ma le prestazioni non sono sensibilmente peggiori degli altri metodi provati sui nostri apparati e set di dati, e il guadagno nella convenienza degli sviluppatori per il taglio arbitrario ne fa la pena per noi.