SQL服务器:如何计算不同容量周期的就寝日

SQL Server: how to calculate beddays over different capacity periods

在 SQL Server 2008 中,我需要生成一个带有参数的 SQL 报告,用户可以在其中输入 StartdateEnddateDepartment name;他们得到的结果是这段时间可能的床位占用情况。然后我可以将它与实际(实现的)床位占用进行比较,后者提供有关部门效率的信息。

鉴于此 table @@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

可以使用

在 select 语句中计算可能的床位占用(床位天数)
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

这显然不完整(甚至不正确),但我似乎无法找出正确的方法。我需要以某种方式确定周期与每个容量类别重叠的天数,然后乘以该容量并将它们全部加起来

谁能给我一些建议?

你不会用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