SQL服务器:如何根据时间间隔(例如2小时内)按日期时间列进行分组

SQL Server: How to group by a datetime column based on a time interval (Such as within 2 hours)

我想根据时间间隔对数据进行分组,比如说 3 小时一组。如何在数据的时间范围内对数据进行分组。

我的数据就像

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

例如,在上面的数据中,我想根据 UserCode 过程对数据进行分组,在一段时间内使用让我们说 10-12。

喜欢

UserCode, Process, Total
   1        10       1
   1        20       2

由于此代码总计数是根据 10-12 之间的时间完成的,并按 UserCodeProcessCode 进行分组。

试试这个方法:

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

Sql Fiddle演示

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

Sql Fiddle演示

或在 group by

中包含 date
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 演示

您应该按解析的日期部分分组

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)

然后合并日期部分进行可视化

我是这样使用的:

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

实际上你可以有两个变量,例如:

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

像这样的东西应该可以工作:

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

我想你要找的只是一个简单的 where 子句

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