条件:
Start date: 31-12-2012
End date: 01-04-2013
project_id
和module_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
我有一个功能,它给出了从开始日期和结束日期开始的日期。
答案 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]
结果:
现在您只需要填写空值并进行一些分组和/或聚合。