2015-05-13 9 views
5

Voglio raggruppare i dati in base all'intervallo di tempo, diciamo un gruppo di 3 ore. Come posso raggruppare un dato entro un periodo di tempo di dati.SQL Server: come raggruppare per una colonna datetime basata su un intervallo di tempo (ad esempio entro 2 ore)

miei dati è come

DocId, UserCode,  ProcessCode, ProcessDone 
1   1    10  21/11/2015 11:04:00 
2   1    10  21/11/2015 12:14:00 
3   1    20  21/11/2015 11:04:00 
4   1    20  21/11/2015 11:54:00 
5   1    30  21/11/2015 13:04:00 

Per esempio nei dati sopra voglio raggruppare i dati in base a UserCode processo utilizzando all'interno cornice di un tempo cerchiamo di dire 10-12.

come

UserCode, Process, Total 
    1  10  1 
    1  20  2 

Dato che questo conteggio totale codice viene fatto in base al tempo tra il 10-12 e il gruppo da UserCode e ProcessCode.

risposta

1

provare in questo modo:

select UserCode, ProcessCode, count(1) Total 
from tab 
where convert(time,ProcessDone) between '10:00' and '12:00' 
group by UserCode, ProcessCode 

Sql Fiddle Demo

o

select UserCode, ProcessCode, count(1) Total 
from tab 
where DATEPART(hh,ProcessDone) > 10 and DATEPART(hh,ProcessDone) < 12 
group by UserCode, ProcessCode 

Sql Fiddle Demo

o comprendente date in group by

select UserCode, ProcessCode, count(1) Total 
from tab 
where convert(time,ProcessDone) between '10:00' and '12:00' 
group by UserCode, ProcessCode, convert(date,ProcessDone) 

Sql Fiddle Demo

+0

Grazie a @Parado ma potrebbe includere i record le cui date sono precedenti alla data richiesta, poiché è solo controllando l'ora non la data. come 20/11/2015 11:00 – Mohit

+0

@Mohit Prova la mia terza soluzione per favore. – Parado

0

Dovreste gruppo da parti della data analizzati

select 
    DATEPART(YEAR,ProcessDone), 
    DATEPART(MONTH,ProcessDone), 
    DATEPART(DAY,ProcessDone), 
    DATEPART(HH,ProcessDone), 
    UserCode, 
    ProcessCode, 
    count(1) Total 
from tab 
group by UserCode, 
    ProcessCode, 
    DATEPART(YEAR,ProcessDone), 
    DATEPART(MONTH,ProcessDone), 
    DATEPART(DAY,ProcessDone), 
    DATEPART(HH,ProcessDone) 

e poi unire parti della data per la visualizzazione

0

Io uso questo modo :

SELECT 
    UserCode, ProcessCode, COUNT(*) As [Total] 
FROM 
    yourTable 
GROUP BY 
    UserCode, ProcessCode, 
    DATEPART(HOUR, ProcessDone) - (DATEPART(HOUR, ProcessDone) + 0) % 2 

Che in realtà si possono avere due variabili come:

.... 
    DATEPART(HOUR, ProcessDone) - (DATEPART(HOUR, ProcessDone) + @start) % @Step 
0

Qualcosa del genere dovrebbe funzionare:

select 
    UserCode, 
    ProcessCode, 
    count(*) Total 
from tab 
group by UserCode, 
    ProcessCode, 
    DATEPART(YEAR,ProcessDone), 
    DATEPART(MONTH,ProcessDone), 
    DATEPART(DAY,ProcessDone), 
    DATEPART(HH,ProcessDone)/3 
; 
0

Penso che tutto quello che state cercando è un semplice clausola where

SELECT UserCode, 
     ProcessCode AS Process, 
     COUNT(*) AS Total 
FROM @yourTable 
WHERE DATEPART(HOUR,ProcessDone) BETWEEN 10 AND 12 
GROUP BY UserCode,ProcessCode 
Problemi correlati