開始日と終了日のペアのギャップを埋める

調子:

Start date: 31-12-2012  
End date:   01-04-2013
  • module represents project_id
  • loading represents that between module_start_date and module_end_date and user_id=6 is 40 percent free.
SELECT [user_id], module_id, module_start_date, module_end_date,
            1 - loading_percentage loading
FROM module_user_master_map
WHERE module_start_date >= '2012-12-31'
      AND module_end_date <= '2013-04-01'
      AND [user_id]=6

このクエリを使用すると、次のような出力が得られます。

user_id | module_id | module_start_date | module_end_date | loading
-------------------------------------------------------------------    
6       | 3         | 01-01-2013        | 31-01-2013      | 0.4
6       | 4         | 15-02-2013        | 28-02-2013      | 0.2
6       | 5         | 01-03-2013        | 15-03-2013      | 0.7
6       | 3         | 30-01-2013        | 30-01-2013      | 0.5

出力を注意深く見てみると、ユーザーは 01-02-2013 から 14-02-2013 まで100%利用可能であると言えます。

//上の文の日付を修正しました。

私は出力を次のようにしたい

user_id | module_id | module_start_date | module_end_date | loading
-------------------------------------------------------------------
6       | 3         | 30-01-2013        | 30-01-2013      | 0.5
6       | 3         | 01-01-2013        | 31-01-2013      | 0.4
6       | Null      | 01-02-2013        | 14-02-2013      | 1
6       | 4         | 15-02-2013        | 28-02-2013      | 0.2
6       | 5         | 01-03-2013        | 15-03-2013      | 0.7
6       | Null      | 16-03-2013        | 01-04-2013      | 1

私には、開始日と終了日からの日付を与える機能があります。

2
nl ru de
これをmysqlとsqlサーバーの両方でタグ付けしました。どのrdbmsを使用していますか?
追加された 著者 Taryn,
SQL Server 2008
追加された 著者 Sunil Harak,

1 答え

あなたはこのアプローチに従うことができます:

あなたの日数を日付テーブル機能からの日数と一緒に、最小/最大範囲内に残してください。 (あなたは既に日付表機能を持っているので、私はそのコードを省略します)

私が第1週と第3週に結果を得たとしましょう。 1月のすべての日に、ギャップがどこにあるかを簡単に見ることができます。

DECLARE @from DATETIME2(1) = '2013-01-01'
DECLARE @to DATETIME2(1) = '2013-01-31'

DECLARE @from_wk1 DATETIME2(1) = '2013-01-01'
DECLARE @to_wk1 DATETIME2(1) = '2013-01-07'

DECLARE @from_wk3 DATETIME2(1) = '2013-01-15'
DECLARE @to_wk3 DATETIME2(1) = '2013-01-22';

WITH    OccupiedDays ( [dt] )
          AS ( SELECT   B.[dt]
               FROM     DateTable(@from_wk1, @to_wk1) B
               UNION ALL
               SELECT   C.[dt]
               FROM     DateTable(@from_wk3, @to_wk3) C
             )
    SELECT  A.[dt]  AS AllDays,
            OD.[dt] AS OccupiedDays
    FROM    DateTable(@from, @to) A
            LEFT JOIN OccupiedDays OD ON A.[dt] = OD.[dt]

結果:

sql output

あなたが今必要とするのは、ヌル値を記入し、いくつかのグループ化および/または集計を行うことだけです。

0
追加された
問題は、一度に多くのユーザーがいて、それらをまとめてグループ化しなければならず、その占有率もそれぞれ変化するということです
追加された 著者 Sunil Harak,