2

健康)状况:

Start date: 31-12-2012  
End date:   01-04-2013
  • 模块代表project_id
  • 加载表示介于module_start_datemodule_end_date和之间user_id=6的 40% 是免费的。
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内100% 可用,14-02-2013即他的负载为 1。

//更正了上面句子中的日期。

我希望输出如下

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

我确实有一个功能,它给我从开始日期和结束日期开始的日期。

4

1 回答 1

0

您可以遵循以下方法:

将您拥有的天数与您的最小/最大范围内的日期表函数中的天数结合起来。(由于您已经有了日期表功能,我将省略该代码)

假设我有第 1 周和第 3 周的结果,当我在一月份的所有日子里加入这些时,你可以很容易地看到差距在哪里。

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输出

您现在只需要填写空值并进行一些分组和/或聚合。

于 2013-01-30T16:12:17.650 回答