SQL Server:如何计算不同容量时段的工作日

时间:2018-03-01 14:13:09

标签: sql-server select case calculation

在SQL Server 2008中,我需要生成一个带有参数的SQL报告,用户可以在其中输入StartdateEnddateDepartment 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

这显然不完整(甚至是正确的),但我似乎无法找出正确的方法。不知何故,我需要确定该时段与每个容量类别重叠的天数,然后乘以该容量并将它们全部添加

有人能给我任何建议吗?

1 个答案:

答案 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