我正在尝试通过DateTime对SQL Server 2012中的记录进行分组。我在stackoverflow上找到了一个我想要的部分示例,但问题是当它超出范围时它不能正确分组。例如,如果我以30分钟为单位对分钟进行分组,则结果是正确的(请参阅下面的查询和结果)。但如果我分组120分钟,我得到了完全相同的结果。它在一小时内分组最多60分钟(结果如下)。 问题是分组不能采用它的父DateTime元素(秒到分钟,分钟到小时,......,甚至几秒到几小时,......)。这有点逻辑,因为我只在几分钟检查,但我希望看到它也过了几个小时。也许使用DATEADD(),但我无法让它工作。
任何想法??
一个(小)示例来说明我的意思:
查询:
DECLARE @TimeInterval int, @StartTime DateTime, @EndTime Datetime
SET @TimeInterval = 30
SET @StartTime='2015-01-01T08:00:00Z'
SET @EndTime = '2015-01-05T10:00:00Z'
declare @T table
(
Value datetime
);
insert into @T values ('2015-01-01T08:00:00');
insert into @T values ('2015-01-01T08:03:00');
insert into @T values ('2015-01-01T08:06:00');
insert into @T values ('2015-01-01T08:14:00');
insert into @T values ('2015-01-01T09:06:00');
insert into @T values ('2015-01-01T09:07:00');
insert into @T values ('2015-01-01T09:08:00');
insert into @T values ('2015-01-01T11:09:00');
insert into @T values ('2015-01-01T12:10:00');
insert into @T values ('2015-01-01T13:11:00');
insert into @T values ('2015-01-02T08:08:00');
insert into @T values ('2015-01-02T08:09:00');
insert into @T values ('2015-01-03T08:10:00');
insert into @T values ('2015-01-04T08:11:00');
SELECT DATEADD(MINUTE, @TimeInterval, Convert(Datetime,CONCAT(DATEPART(YEAR, Value),'-', DATEPART(MONTH, Value),
'-', DATEPART(DAY, Value),' ', DATEPART(HOUR, Value),':', ((DATEPART(MINUTE, Value) / @TimeInterval) * @TimeInterval),':00'),120)) as Period,
ISNULL(COUNT(*), 0) AS NumberOfVisitors
FROM @T
WHERE Value >= @StartTime AND Value < @EndTime
GROUP BY Convert(Datetime,CONCAT(DATEPART(YEAR, Value),'-', DATEPART(MONTH, Value), '-', DATEPART(DAY, Value),' ',
DATEPART(HOUR, Value),':',((DATEPART(MINUTE, Value) / @TimeInterval) * @TimeInterval),':00'),120)
ORDER BY Period
结果30分钟
2015-01-01 08:30:00.000 | 4
2015-01-01 09:30:00.000 | 3
2015-01-01 11:30:00.000 | 1
2015-01-01 12:30:00.000 | 1
2015-01-01 13:30:00.000 | 1
2015-01-02 08:30:00.000 | 2
2015-01-03 08:30:00.000 | 1
2015-01-04 08:30:00.000 | 1
结果60分钟
2015-01-01 08:30:00.000 | 4
2015-01-01 09:30:00.000 | 3
2015-01-01 11:30:00.000 | 1
2015-01-01 12:30:00.000 | 1
2015-01-01 13:30:00.000 | 1
2015-01-02 08:30:00.000 | 2
2015-01-03 08:30:00.000 | 1
2015-01-04 08:30:00.000 | 1
提前致谢!
答案 0 :(得分:2)
您不希望datepart()
用于此目的。你想要分钟计数。一种方法是使用datediff()
:
SELECT datediff(minute, @StartTime, value) / @TimeInterval as minutes,
COUNT(*) AS NumberOfVisitors
FROM @T
WHERE Value >= @StartTime AND Value < @EndTime
GROUP BY datediff(minute, @StartTime, value) / @TimeInterval
ORDER BY minutes ;
SQL Server执行整数除法,因此在这种情况下您不必担心余数。另外,COUNT(*)
无法返回NULL
,因此ISNULL()
和COALESCE()
都不合适。
或者,要获取日期/时间值:
SELECT dateadd(day,
datediff(minute, @StartTime, value) / @TimeInterval,
@StartTime) as period,
COUNT(*) AS NumberOfVisitors
FROM @T
WHERE Value >= @StartTime AND Value < @EndTime
GROUP BY datediff(minute, @StartTime, value) / @TimeInterval
ORDER BY period ;