2017-05-22 15 views
-1

日付の範囲を変換して、その日の開始日と終了日を1行にする方法を教えてください。SQLの日付範囲を毎日の行に変換する方法

I looked at this post about date ranges to row - これは別の問題です。上記にリンクされた他の解決策は、毎日の開始から終了までの時間を与えないため、デューティファクタまたは利用率の計算、またはガントチャートの構築を考慮していません。

IDフィールド、開始日、終了日を基本表とします。その範囲でどれくらいの時間が費やされたかで、これを1日あたりのIDフィールドを含むように変換します。

これは、開始日と終了日を毎日のデューティファクタと機器使用率などの他の多くのニーズに変換する場合に非常に便利です。

+0

使用しているdbmsにタグを付けると、既に製品固有の回答が1つあります。 – jarlh

+0

サンプルテーブルのデータと予想される結果を追加します。現在のクエリの試行も表示してください。 – jarlh

+0

[SQL Serverで日付の範囲を生成する方法](https://stackoverflow.com/questions/11141507/how-to-generate-a-range-of-dates-in-sql-server) – McNets

答えて

0

私はこのコミュニティから多くの助けを借りてこれを理解しました。私は他の人にも同様に使用するための最終的なSQLスクリプトをここに入れたいと思っていました。

WITH cte ([VID],[StartTime],[EndTime]) AS 
    (SELECT tbl.[ID] as 'VID' 
       ,CONVERT(VARCHAR(19), tbl.[StartDT], 120) AS 'StartTime' 
       ,CASE 
       WHEN tbl.[EndDT] <= CONVERT(VARCHAR(11), tbl.[StartDT]+1, 120) + '00:00:00' THEN CONVERT(VARCHAR(19), tbl.[EndDT], 120) 
       ELSE CONVERT(VARCHAR(11), tbl.[StartDT]+1, 120) + '00:00:00' 
       END as 'EndTime' 
     FROM [SourceTable] as tbl 
     WHERE DATEDIFF(DAY,tbl.[StartDT],tbl.[EndDT])<=365 

     UNION ALL 

     SELECT tbl.[ID] as 'VID' 
       ,CONVERT(VARCHAR(11), DATEADD(DAY, 1, cte.[StartTime]), 120) + '00:00:00' AS 'StartTime' 
       ,CASE 
       WHEN CONVERT(VARCHAR(19), tbl.[EndDT], 120) < CONVERT(VARCHAR(11), DATEADD(DAY, 2, cte.[StartTime]), 120) + '00:00:00' 
       THEN CONVERT(VARCHAR(19), tbl.[EndDT], 120) 
       ELSE CONVERT(VARCHAR(11), DATEADD(DAY, 2, cte.[StartTime]), 120) + '00:00:00' 
       END AS 'EndTime' 
     FROM cte 
      INNER JOIN [SourceTable] as tbl 
       ON cte.VID = tbl.ID 
     WHERE CONVERT(VARCHAR(11), cte.[StartTime], 120) < CONVERT(VARCHAR(11), tbl.[EndDT], 120)) 

SELECT VID AS ID 
     ,[StartTime] 
     ,[EndTime] 
     ,DateDiff (second,[StartTime],[EndTime])/3600 As 'Hours' 
     ,DateDiff (second,[StartTime],[EndTime])/60 % 60 as 'Minutes' 
     ,((DateDiff (Second,[StartTime],[EndTime])/3600)*60)+(DateDiff (second,starttime,endtime)/60 % 60) as 'Total Minutes' 
     ,DATEPART(week,[StartTime]) AS weeknum 
     ,MONTH([StartTime]) AS MonthNumber 
     ,DATENAME(month,[StartTime]) AS MonthName 

    FROM cte order by Id, [StartTime] 
    option (maxrecursion 0); 
+0

の可能な複製dbmsが指定されていない質問に対する製品固有の回答です。少なくとも、これがどのdbmsであるかを教えてください。 – jarlh

+0

それはSQL Serverのようだ... –

+0

はい、私の謝罪、私はタグにSQLを入れます。それはSQLです。 –

関連する問題