2014-10-28 100 views
0

我的数据库中有一个存档表,其中包含数百万个日期/时间值对。现在我需要使用JavaScript图表在网页上提供这些数据。通过指定可变时间间隔获取汇总数据

由于我需要实现某种延迟加载和数据聚合的大量数据。在客户端,一切都已经正常工作(使用模拟聚合数据) - 缺少的是传递数据的服务器端SQL查询。

准确地说:我不知道如何通过指定的可变时间量(以分钟给出,例如),其中结果给我的最小值,最大值和平均值为间隔来查询数据。

目前我使用此代码,给了我在每个小时的基础所需的数据:

SELECT CAST(DATEADD(hour,FLOOR(DATEDIFF(hour,0,CAST(DateValue AS datetime))),0) as datetime) as d, avg(Value) as Av, min(Value) as Mn, max(Value) as Mx 
    FROM [TESTDB].[dbo].[ValueArchive] 
    WHERE StationId=5 and DataPointId=21507 
    GROUP BY CAST(DATEADD(hour,FLOOR(DATEDIFF(hour,0,CAST(DateValue AS datetime))),0) as datetime) 
    order by d 

该查询返回的数据是这样的:

Zeit     Av     Mn     Mx 
2014-07-31 07:00:00.000 21,5311364673079 21,1000043854118 22,0000043988228 
2014-07-31 08:00:00.000 21,5188868579348 21,0000043839216 22,0000043988228 
2014-07-31 09:00:00.000 21,5014227301436 10,3    21,9000043973327 
2014-07-31 10:00:00.000 21,6056305272473 21,1000043854118 22,200004401803 
2014-07-31 11:00:00.000 21,7478380172488 21,300004388392  22,200004401803 
2014-07-31 12:00:00.000 21,9086686573894 21,5000043913722 22,4000044047833 
2014-07-31 13:00:00.000 22,6290701521411 21,7000043943524 25,2000044465065 
2014-07-31 14:00:00.000 24,3890669344227 23,7000044241548 25,1000044450164 
2014-07-31 15:00:00.000 23,5097663260819 23,000004413724  24,0000044286251 
2014-07-31 16:00:00.000 23,3656704604484 22,9000044122338 23,900004427135 
2014-07-31 17:00:00.000 23,3113943797538 22,9000044122338 23,8000044256449 
2014-07-31 18:00:00.000 23,3023299996241 22,8000044107437 23,8000044256449 
2014-07-31 19:00:00.000 23,3033443003657 22,8000044107437 23,8000044256449 
2014-07-31 20:00:00.000 23,265605921441  22,7000044092536 23,8000044256449 
2014-07-31 21:00:00.000 23,1962274382304 22,7000044092536 23,8000044256449 
2014-07-31 22:00:00.000 23,0771869545565 22,6000044077635 23,5000044211745 
2014-07-31 23:00:00.000 22,9476058889577 22,200004401803  23,5000044211745 
2014-08-01 00:00:00.000 22,7839329819327 22,3000044032931 23,2000044167042 
2014-08-01 01:00:00.000 22,6155113662449 22,0000043988228 23,1000044152141 
2014-08-01 02:00:00.000 22,4463981676577 21,9000043973327 22,9000044122338 

这是一个良好的开端,但我不知道如何更改此查询以这样一种方式,它与间隔作品如2分钟,15分钟或为5秒等时间间隔开始/结束日期应当与充分小时,因此,如果您在指定的时间范围内每10分钟查询一次,数据块应包含10:00的数据至10:10,10:10至10:20等。(此量化与使用相同的时间的x轴附加的独立数据序列时工作是很重要的。)

有一种方法来直接在实现该功能数据库通过使用查询(或存储过程)?或者我必须首先获取所有数据,然后在Web服务器上进行聚合?

感谢您的帮助!

回答

1

由于SQL Server中的整数除法将返回一个整数,因此您可以得到DateValue与某个时期之间的时间差,并将其除以您的时间间隔,然后按您的时间间隔重新乘以并将结果转换回日期时间。这将调整您间隔一小时(前提是你使用匀值7秒的时间间隔不会保持一致,但5个seonds会为例子)。在下面,我使用分钟,但它是微不足道的改变它使用秒:

declare @interval_minutes int = 15 
select dateadd(MINUTE, DATEDIFF(MINUTE, '01-jan-1970', DateValue)/@interval_minutes*@interval_minutes, '01-jan-1970') as d 
     avg(Value) as Av, 
     min(Value) as Mn, 
     max(Value) as Mx 
FROM [TESTDB].[dbo].[ValueArchive] 
WHERE StationId=5 and DataPointId=21507 
group by DATEDIFF(MINUTE, '01-jan-1970', DateValue)/@interval_minutes 

举例来说这个SQL:

declare @interval_minutes int = 15 
select dateadd(MINUTE, DATEDIFF(MINUTE, '01-jan-1970', getdate())/@interval_minutes*@interval_minutes, '01-jan-1970') as d 

将返回2014-10-28 13:15:00.000当我在13:23上运行10月28日

更改时间间隔为30给出2014-10-28 13:00:00.000