2017-05-30 12 views
2

開始時間、終了時間、頻度、期間を別々の行に分けようとしています。ここではいくつかのサンプルデータは、次のとおりです。時間を分割して行を分割する

+------+------------+----------+-----------------+---------------+ 
| Name | Start_Time | End_Time | Frequency_Hours | Duration_Mins | 
+------+------------+----------+-----------------+---------------+ 
| A | 08:00:00 | 18:00:00 |    2 |    2 | 
| B | 00:00:00 | 23:59:59 |    1 |    5 | 
| C | 00:00:00 | 23:59:59 |    4 |   15 | 
+------+------------+----------+-----------------+---------------+ 

は、次のクエリを使用して作成することができます:

:ここ

DECLARE @Tmp AS TABLE(Name VARCHAR(128) 
        ,Start_Time VARCHAR(8) 
        ,End_Time VARCHAR(8) 
        ,Frequency_Hours INT 
        ,Duration_Mins INT) 

INSERT INTO @Tmp VALUES ('A','08:00:00', '18:00:00', 2,2) 
         ,('B','00:00:00', '23:59:59', 1,5) 
         ,('C','00:00:00', '23:59:59', 4,15) 

は私の所望の出力(私は、ガントチャートの視覚化を推進するためにこれを使用します)です

+------+------------+----------+ 
| Name | Start_Time | End_Time | 
+------+------------+----------+ 
| A | 08:00:00 | 08:02:00 | 
| A | 10:00:00 | 10:02:00 | 
| A | 12:00:00 | 12:02:00 | 
| A | 14:00:00 | 14:02:00 | 
| A | 16:00:00 | 16:02:00 | 
| A | 18:00:00 | 18:02:00 | 
| B | 00:00:00 | 00:05:00 | 
| B | 01:00:00 | 01:05:00 | 
| B | 02:00:00 | 02:05:00 | 
| B | 03:00:00 | 03:05:00 | 
| B | 04:00:00 | 04:05:00 | 
| B | 05:00:00 | 05:05:00 | 
| B | 06:00:00 | 06:05:00 | 
| B | 07:00:00 | 07:05:00 | 
| B | 08:00:00 | 08:05:00 | 
| B | 09:00:00 | 09:05:00 | 
| B | 10:00:00 | 10:05:00 | 
| B | 11:00:00 | 11:05:00 | 
| B | 12:00:00 | 12:05:00 | 
| B | 13:00:00 | 13:05:00 | 
| B | 14:00:00 | 14:05:00 | 
| B | 15:00:00 | 15:05:00 | 
| B | 16:00:00 | 16:05:00 | 
| B | 17:00:00 | 17:05:00 | 
| B | 18:00:00 | 18:05:00 | 
| B | 19:00:00 | 19:05:00 | 
| B | 20:00:00 | 20:05:00 | 
| B | 21:00:00 | 21:05:00 | 
| B | 22:00:00 | 22:05:00 | 
| B | 23:00:00 | 23:05:00 | 
| C | 00:00:00 | 00:15:00 | 
| C | 04:00:00 | 04:15:00 | 
| C | 08:00:00 | 08:15:00 | 
| C | 12:00:00 | 12:15:00 | 
| C | 16:00:00 | 16:15:00 | 
| C | 20:00:00 | 20:15:00 | 
+------+------------+----------+ 

私はこのことからビューを作成できるようにしたいので、私はカーソルや他のCPU集約的なメソッドなしでそれをやろうとしています。

アイデア?

おかげで、

ダン。

答えて

1

またRECURSIIVE CTEせずに行うことができます。

select distinct number master..spt_valuesの代わりにnumberを作成すると、パフォーマンスがはるかに向上します。数表のように

1から100に取り込むことができ

これは御馳走を働いた

declare @t table(Name varchar(20), Start_Time time(0),End_Time time(0) 
, Frequency_Hours int,Duration_Mins int) 
insert into @t VALUES 
('A','08:00:00','18:00:00', 2 , 2) 
,('B','00:00:00','23:59:59', 1 , 5) 
,('C','00:00:00','23:59:59', 4 ,15) 

SELECT NAME 
    ,dateadd(hour, n, Start_Time) Start_Time 
    ,dateadd(minute, Duration_Mins, (dateadd(hour, n, Start_Time))) End_Time 
FROM @t t 
CROSS APPLY (
    SELECT DISTINCT number * Frequency_Hours n 
    FROM master..spt_values 
    WHERE number >= 0 
     AND number <= datediff(HOUR, t.Start_Time, t.End_Time)/Frequency_Hours 
    ) ca 
+0

非常にうまく動作し、CTEではないので、自分のコードで作業するのがとても簡単です。ありがとう! –

5

あなたはこの

;WITH temp AS 
(
    SELECT t.Name, CAST(t.Start_Time AS time) AS CurrentStart_Time, dateadd(minute,t.Duration_Mins,CAST(t.Start_Time AS time)) AS CurrentEnd_Time, t.Frequency_Hours, CAST(t.End_Time AS time) AS End_Time 
    FROM @Tmp t 

    UNION ALL 

    SELECT t.Name, dateadd(hour,t.Frequency_Hours,t.CurrentStart_Time), dateadd(hour,t.Frequency_Hours,t.CurrentEnd_Time), t.Frequency_Hours, t.End_Time 
    FROM temp t 
    WHERE t.CurrentStart_Time < t.End_Time AND t.CurrentStart_Time < dateadd(hour,t.Frequency_Hours,t.CurrentStart_Time) 
) 

SELECT t.Name, t.CurrentStart_Time, t.CurrentEnd_Time 
FROM temp t 
ORDER BY t.Name 
OPTION (MAXRECURSION 0) 

デモリンクのようrecursive cteを使用することができます。http://rextester.com/XJK25805

+0

、様々なサンプルデータでこれを試してみてください!ありがとう! –

+0

あなたは歓迎です、@DanielHitchcock – TriV