SQL Server:如何计算不同容量时段的工作日
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server:如何计算不同容量时段的工作日相关的知识,希望对你有一定的参考价值。
在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
这显然不完整(甚至是正确的),但我似乎无法找出正确的方法。不知何故,我需要确定该时段与每个容量类别重叠的天数,然后乘以该容量并将它们全部加起来
谁能给我任何建议?
答案
你能不能使用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
以上是关于SQL Server:如何计算不同容量时段的工作日的主要内容,如果未能解决你的问题,请参考以下文章
Microsoft SQL Server Management Studio 已超过了锁请求超时时段。 (Microsoft SQL Server,错误: 1222)
如何在 SQL Server 中的滑动窗口上聚合(计算不同的项目)?
如何更改实体框架项目以使用 Microsoft SQL Server