Sql server t可能会添加一个额外的列,用于标记。我的原始数据包括一列徽章编号,我想以某种方式自动循环所有徽章的日期时间数据,并创建一个表格,我可以将其拉入excel、筛选和图表。@beliskna是的,您可以。但是ut是另一个问题:)谢谢。我会这样提的。感谢所有参与的

Sql server t可能会添加一个额外的列,用于标记。我的原始数据包括一列徽章编号,我想以某种方式自动循环所有徽章的日期时间数据,并创建一个表格,我可以将其拉入excel、筛选和图表。@beliskna是的,您可以。但是ut是另一个问题:)谢谢。我会这样提的。感谢所有参与的,sql-server,Sql Server,t可能会添加一个额外的列,用于标记。我的原始数据包括一列徽章编号,我想以某种方式自动循环所有徽章的日期时间数据,并创建一个表格,我可以将其拉入excel、筛选和图表。@beliskna是的,您可以。但是ut是另一个问题:)谢谢。我会这样提的。感谢所有参与的人,你们真的帮助了我,但我选择了gofr1中的解决方案,因为这对我来说是最容易理解的。是否可以扩展这个想法,以便添加一个额外的列,用于标记。我的原始数据包括一列徽章编号,我想以某种方式自动循环所有徽章的日期时间数据,并创建一个表格,我可以将其拉


t可能会添加一个额外的列,用于标记。我的原始数据包括一列徽章编号,我想以某种方式自动循环所有徽章的日期时间数据,并创建一个表格,我可以将其拉入excel、筛选和图表。@beliskna是的,您可以。但是ut是另一个问题:)谢谢。我会这样提的。感谢所有参与的人,你们真的帮助了我,但我选择了gofr1中的解决方案,因为这对我来说是最容易理解的。是否可以扩展这个想法,以便添加一个额外的列,用于标记。我的原始数据包括一列徽章编号,我想以某种方式自动循环所有徽章的日期时间数据,并创建一个表格,我可以将其拉入excel、筛选和图表。@beliskna是的,您可以。但是ut是另一个问题:)谢谢。我会这样提的。
OnTime            OffTime           Duration
2017-11-01 00:03  2017-11-01 00:04  1
2017-11-01 00:08  2017-11-01 00:11  3
2017-11-01 00:13  2017-11-01 00:14  1
2017-11-01 00:21  2017-11-01 00:24  3
2017-11-01 00:26  2017-11-01 00:30  4
Minute   Active
0        0
1        0      
2        0
3        1
4        0
5        0
6        0
7        0
8        1
9        1
10       1
11       0
12       0
13       1
14       0
15       0
...      ...
1440     0
CREATE FUNCTION [dbo].[GetAllMinutesBetweenRange]
(
   @FromDate DATETIME
   ,@ToDate DATETIME

)
RETURNS @Dates TABLE
(
   DateVal DATETIME
)
AS
BEGIN

;WITH CTE
AS
(
    SELECT @FromDate AS FromDate
    UNION ALL
    SELECT DATEADD(MI,1,FromDate)
    FROM CTE
    WHERE FromDate < @ToDate
)

INSERT INTO @Dates
SELECT FromDate FROM CTE
option (maxrecursion 0)

RETURN;

END

    SELECT ROW_NUMBER() OVER(ORDER BY DATEVAL) AS MINUTE
      ,DATEVAL
      ,CASE WHEN TableA.OnTime IS NULL THEN 0 ELSE 1 END 
FROM [dbo].[GetAllMinutesBetweenRange]('2017-11-01 00:00:00','2017-11-01 23:59:00') Res1
LEFT JOIN TableA ON Res1.DateVal >= TableA.OnTime AND Res1.DateVal< TableA.OffTime
WITH CTE
AS
(
   SELECT
    SeqNo = 0,    
    Strt = CAST(CAST(GETDATE() AS DATE) AS DATETIME)

  UNION ALL

  SELECT
    SeqNo = SeqNo+1,  
    Strt = DATEADD(minute,1,Strt)
  FROM CTE
    WHERE CAST(CAST(Strt AS DATE) AS DATETIME)=CAST(CAST(GETDATE() AS DATE) AS DATETIME)

)
SELECT
  SeqNo AS Minute,
  Active = CASE WHEN T1.Duration IS NOT NULL THEN 1 ELSE 0 END
FROM CTE C1
  LEFT JOIN T1
    ON CAST(T1.OnTime AS DATETIME) >= CAST(C1.Strt AS DATETIME)
      AND CAST(T1.OffTime AS DATETIME) <= CAST(C1.Strt AS DATETIME)
OPTION (maxrecursion 0)
DECLARE @somedate date = '2017-11-01'

DECLARE @somedateN nvarchar(10) = CAST(@somedate as nvarchar(10))
DECLARE @start datetime = CAST(@somedateN +' 00:00:00' as datetime),
        @end datetime = CAST(@somedateN +' 23:59:59' as datetime)

-- Simulation of your table with some new rows
;WITH cte AS (
    SELECT  OnTime,
            OffTime,
            Duration
    FROM (VALUES
    ('2017-11-01 00:03', '2017-11-01 00:04', 1),
    ('2017-11-01 00:08', '2017-11-01 00:11', 3),
    ('2017-11-01 00:13', '2017-11-01 00:14', 1),
    ('2017-11-01 00:21', '2017-11-01 00:24', 3),
    ('2017-11-01 00:26', '2017-11-01 00:30', 4),
    ('2017-11-01 00:59', '2017-11-01 01:30', 31),   -- new row
    ('2017-11-01 23:57', '2017-11-02 00:02', 5)     -- new row
    ) as t(OnTime,OffTime,Duration)
), minutes_ AS ( -- table with all minutes from 0 to 1440
    SELECT  0 as [Minute]
    UNION ALL
    SELECT  [Minute] + 1
    FROM minutes_
    WHERE [Minute] <= DATEDIFF(minute,@start,@end) 
)
-- here we go!
SELECT  [Minute],
        CASE WHEN c.Duration IS NULL THEN 0 ELSE 1 END as [Active]
FROM minutes_ m
LEFT JOIN cte c
    ON m.[Minute] >= DATEDIFF(minute,@start,OnTime) 
    AND m.[Minute] < DATEDIFF(minute,@start,OffTime) 
OPTION (MAXRECURSION 0)
Minute      Active
----------- -----------
0           0
1           0
2           0
3           1
4           0
5           0
6           0
7           0
8           1
9           1
10          1
11          0
12          0
13          1
...
1434        0
1435        0
1436        0
1437        1
1438        1
1439        1
1440        1
declare @dateTable table(OnTime datetime, OffTime datetime, Duration int)
insert into @dateTable values('2017-11-01 00:03','2017-11-01 00:04',1)
insert into @dateTable values('2017-11-01 00:08','2017-11-01 00:11',3)
insert into @dateTable values('2017-11-01 00:13','2017-11-01 00:14',1)
insert into @dateTable values('2017-11-01 00:21','2017-11-01 00:24',3)
insert into @dateTable values('2017-11-01 00:26','2017-11-01 00:30',4)

declare @result table(minute int, active bit)
declare @length int = 1440
declare @index int = 0

while @index <= @length
begin
    insert into @result values(@index,0)
    set @index = @index + 1
end

update t
set t.active = case when d.OnTime is not null then 1 else 0 end 
from @result as t
left join @dateTable as d on t.minute >= datepart(hour,ontime)*60 + datepart(minute,ontime)
                        and t.minute < datepart(hour,offtime)*60 + datepart(minute,offtime)

select * from @result