如何按时间段来汇总数据

2015-01-26 10:48:39 · 作者: · 浏览: 9

说起汇总, 大家都觉得再简单不过了, 但真有这么简单吗?

如果希望每5分钟汇总一次, 那怎么办?

不卖关子了, 其实也不难, 写一个标量函数就可以了。

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Fun_GetTimeSeg]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	DROP FUNCTION [dbo].[Fun_GetTimeSeg]
GO
-- =============================================
-- Author:		yenange
-- Create date: 2015-01-21
-- Description:	得到时间分段
-- =============================================
CREATE FUNCTION Fun_GetTimeSeg 
(
	@d DATETIME,
	@splitMinutes INT
)
RETURNS CHAR(22)
AS
BEGIN
	DECLARE @r CHAR(22) 
	--1. 得到当前时间的0点
	DECLARE @t0 DATETIME, @div INT
	SET @t0 = CONVERT(DATETIME, CONVERT(CHAR(10), @d, 120))
	SET @div = DATEDIFF(n, @t0, @d)/@splitMinutes
	SET @r = CONVERT(CHAR(16), DATEADD(n, @div*@splitMinutes, @t0), 120)+'-'+CONVERT(CHAR(5), DATEADD(n, (@div+1)*@splitMinutes, @t0), 114)

	RETURN @r
END
GO

测试代码:

DECLARE @d DATETIME,@dMax DATETIME, @splitMintues INT
SELECT @d='2015-01-21',@dMax='2015-01-22', @splitMintues=5

DECLARE @t TABLE ( rowNum INT IDENTITY(1,1), [time] DATETIME, timeSeg CHAR(22) ) 

WHILE @d<@dMax
BEGIN
	INSERT INTO @t ([time] , timeSeg)
	SELECT @d, dbo.Fun_GetTimeSeg(@d, @splitMintues)
	
	SET @d = DATEADD(n, 1, @d)
END

SELECT * FROM @t

分段结果:


当然了, 汇总时 group by dbo.Fun_GetTimeSeg(@d, @splitMintues) 就好了, 不再赘述。