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 之间的时间完成的,并按 UserCode
和 ProcessCode
进行分组。
试试这个方法:
select UserCode, ProcessCode, count(1) Total
from tab
where convert(time,ProcessDone) between '10:00' and '12:00'
group by UserCode, ProcessCode
或
select UserCode, ProcessCode, count(1) Total
from tab
where DATEPART(hh,ProcessDone) > 10 and DATEPART(hh,ProcessDone) < 12
group by UserCode, ProcessCode
或在 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
我想根据时间间隔对数据进行分组,比如说 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 之间的时间完成的,并按 UserCode
和 ProcessCode
进行分组。
试试这个方法:
select UserCode, ProcessCode, count(1) Total
from tab
where convert(time,ProcessDone) between '10:00' and '12:00'
group by UserCode, ProcessCode
或
select UserCode, ProcessCode, count(1) Total
from tab
where DATEPART(hh,ProcessDone) > 10 and DATEPART(hh,ProcessDone) < 12
group by UserCode, ProcessCode
或在 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