根据下面给出的结构设置时间间隔

时间:2014-03-07 06:31:18

标签: sql

表结构可能是这样的。

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

1 个答案:

答案 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

的代码