表结构可能是这样的。
S.no Time Interval no of keys
1 8:00 AM - 8:10 AM(ENTRY STARTS) 66
2 8:10 AM- 8:20 AM 6
3 8:20 AM - 8:30 AM 43
....
Nth 3:50PM - 4:00 PM(LAST ENTRY FOR REPORT)
如何使用SQL查询执行此操作,并且我想在ASP.NET GridView中使用它?
使用以下数据,现在我尝试将键数设置在workdatetime的开始时间和此workdatetime的最后时间之间。
注意:时间间隔已更改,请不要担心
我无法在时间间隔之间放置NO OF KEYS。
我想显示与上面相同的结构,只相对于时间间隔添加一列键数。
WorkdateTime ************ NoOfKeys
16:52:04 ************ 54
16:52:06 ************ 0
16:52:07 ************ 2
16:52:25 ************ 0
16:52:26 ************ 0
16:52:35 ************ 0
16:52:35 ************ 0
16:53:15 ************ 0
16:53:55 ************ 0
16:54:28 ************ 11
16:54:35 ************ 0
16:55:15 ************ 0
16:55:55 ************ 0
16:56:35 ************ 0
16:57:15 ************ 0
16:57:28 ************ 103
16:57:55 ************ 0
16:58:35 ************ 0
16:58:39 ************ 2
16:59:09 ************ 19
16:59:15 ************ 0
16:59:42 ************ 40
16:59:43 ************ 2
16:59:55 ************ 0
17:00:35 ************ 0
17:01:15 ************ 0
17:01:35 ************ 4
17:01:55 ************ 0
17:02:35 ************ 0
17:03:15 ************ 0
17:03:55 ************ 0
17:03:58 ************ 2
17:04:24 ************ 3
17:04:35 ************
17:05:15 ************ 0
17:05:40 ************ 0
17:05:46 ************ 14
17:05:47 ************ 0
17:05:50 ************ 2
17:06:30 ************ 0
17:06:37 ************ 1
17:07:10 ************ 0
17:07:50 ************ 0
17:08:12 ************ 1
17:08:30 ************ 0
17:09:10 ************ 0
17:09:27 ************ 42
17:09:50 ************ 0
答案 0 :(得分:0)
请检查以下查询。该解决方案使用CTE生成开始时间和结束时间之间的所有时间范围,并使用workdatetime数据表生成LEFT JOIN
:
DECLARE @mindate DATETIME
DECLARE @maxdate DATETIME
SET @mindate = '08:00 AM'
SET @maxdate = '05:00 PM'
;WITH cte(startDt, endDt)
AS
(
SELECT @mindate AS startDt, DATEADD(mi,10,@mindate) AS endDt
UNION ALL
SELECT cte.endDt, DATEADD(mi,10,cte.endDt) FROM cte WHERE endDt < @maxdate
)
SELECT LTRIM(RIGHT(CONVERT(VARCHAR(20), startDt, 100), 7))+'-'+LTRIM(RIGHT(CONVERT(VARCHAR(20), endDt, 100), 7)) timerange, SUM(ISNULL(NoOfKeys,0))
FROM cte
LEFT JOIN Work w
ON w.WorkDateTime >= cte.StartDt AND w.WorkDateTime < cte.EndDt
GROUP BY startDt, EndDt
option (maxrecursion 32767)
如果您正在寻找,请告诉我。
以下是SQL Fiddle
的代码