填写开始/结束日期对中的空白

时间:2013-01-29 11:15:36

标签: sql-server sql-server-2008 tsql

条件:

Start date: 31-12-2012  
End date:   01-04-2013
  • 模块代表{​​{1}}
  • loading代表project_idmodule_start_date之间,而module_end_date的免费率为40%。
user_id=6

使用此查询,我得到以下输出:

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%可用,即他的加载为1。

//纠正上述句子中的日期。

我希望输出如下

14-02-2013

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

1 个答案:

答案 0 :(得分:0)

您可以采用以下方法:

在最小/最大范围内,从日期表函数的日期开始加入日期。 (由于你已经有了日期表功能,我将省略该代码)

说我有第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

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