在SQL Server 2008中,我需要生成一个带有参数的SQL报告,用户可以在其中输入Startdate
,Enddate
和Department name
;他们得到的结果是这个时期可能的床位。然后我可以将它与实际(已实现的)床位进行比较,该职业可以提供有关部门效率的信息。
鉴于此表@@Temptable01
:
Department_name Bed_Capacity CAP_Startdate CAP_Enddate
------------------------------------------------------------
Dept_ A 20 1-1-2015 31-12-2015
Dept_ A 22 1-1-2016 31-8-2016
Dept_ B 21 1-1-2015 Null
Dept_ C 30 1-1-2017 30-6-2017
Dept_ A 24 1-9-2016 Null
Dept_ C 32 1-7-2017 Null
可以使用
在选择语句中计算可能的床位(床位日)Bed_Capacity * (enddate – startddate)
如果选择的报告期间与不同容量的多个期间重叠,则会出现问题。
我正在考虑使用以下案例陈述:
Select
Department_name,
(case when startdate between CAP_Startdate and CAP_Enddate
and (enddate between CAP_Startdate and CAP_Enddate
or CAP_Enddate is null)
then Bed_Capacity * (Enddate – CAP_Startdate)) as beddays
From
@@Temptable01
这显然不完整(甚至是正确的),但我似乎无法找出正确的方法。不知何故,我需要确定该时段与每个容量类别重叠的天数,然后乘以该容量并将它们全部添加
有人能给我任何建议吗?
答案 0 :(得分:0)
你能不能使用DATEDIFF函数算出重叠天数?
DECLARE @t TABLE(
Department NVARCHAR(10),
BedCapacity INT,
CAP_StartDate DATE,
CAP_EndDate DATE)
INSERT INTO @t
VALUES
('Dept_ A', 20,'2015-01-01', '2015-12-31'),
('Dept_ A', 22,'2016-01-01', '2016-08-31'),
('Dept_ B', 21,'2015-01-01', NULL),
('Dept_ C', 30,'2017-01-01', '2017-06-30'),
('Dept_ A', 24,'2016-09-01', NULL),
('Dept_ C', 32,'2017-07-01', NULL)
DECLARE
@StartDate DATE = '2015-03-01',
@EndDate DATE = '2016-02-28'
SELECT
*,
t.BedCapacity * DATEDIFF(DAY,
CASE WHEN t.CAP_StartDate > @StartDate THEN t.CAP_StartDate ELSE @StartDate END,
CASE WHEN COALESCE(t.CAP_EndDate, @EndDate) < @EndDate THEN t.CAP_EndDate ELSE @EndDate END) Total
FROM @t t
WHERE t.CAP_StartDate <= @EndDate
AND COALESCE(t.CAP_EndDate, @EndDate) >= @StartDate