2011-12-19 83 views
2

有一个带有datetime_in,datetime_out,card_id,group的表。知道我要在以下事项输出:sql查询分为15分钟

group ; date  ; quarterTime ; persons_in ; hours 
group1 ; 17-02-2010 ; 00:00 - 00:15 ; 0   ; 0 
group1 ; 17-02-2010 ; 00:15 - 00:30 ; 0   ; 0 
group1 ; 17-02-2010 ; 00:30 - 00:45 ; 0   ; 0 
~etc 
group1 ; 17-02-2010 ; 13:00 - 12:15 ; 334  ; 1483 

end then the same for all the groups starting with 00:00 until 23:45 

所以对于每一天的quearter我想有一个记录,由小组,日期分组(天数)和quarterTime。然后在persons_in中,我希望在该季度内的记录计数,以及以小时为单位,直到当前季度结束时,总共有多少个人工作小时。所以每天只能得到更高和更高的人数,而只有人数在该季度内。所以我的问题是,我现在有一个非常肮脏的C#脚本来做这件事,因为我想运行的最优化只有一个查询。

我不介意使用存储过程,但由于我不是很擅长sql,我更喜欢T-SQL。

任何人有想法如何做到这一点?例子?

+1

15分钟分组部分是[SQL - 将开始/结束时间分成15分钟记录]的副本(http://stackoverflow.com/questions/2921760/sql-break-a-start-end-time -INTO 15分钟,记录)。运行总计部分是[在SqlServer中计算运行总计]的副本(http://stackoverflow.com/questions/860966/calculate-a-running-total-in-sqlserver)。 – GSerg 2011-12-19 11:47:08

+0

谢谢,ik可以使用SqlServer中的Calculate a Running Total,但15分钟内的开始/结束时间与我想要的不同。 – Eijso 2011-12-19 11:52:58

回答

2

你可以用这个逻辑来改变你的日期进行分组:

SELECT 
     CONVERT(bigint,Year(GETDATE())) * power(10,7) + 
     Month(GETDATE()) * POWER(10,5) + 
     Day(GETDATE()) * POWER(10,3) + 
     Datepart(hh,GETDATE()) * POWER(10,1) + 
     DATEPART(mi,GETDATE())/15 AS Agg_Date 

19/12/2011 13:31 => 20111219132

每次15分钟有相同的密钥。