首页 > 解决方案 > 计算 2 个日期列

问题描述

所以我有 2 个日期列,开始和结束。我要完成的是每天的库存,这将追溯到 2020 年初,因此我拥有以下字段:

开始日期、当天新增的数量、当天关闭的数量以及前几天的现有打开数量。我派生的基本数据结构是开始日期、结束日期、请求类型(如果开始日期 = 报告日期且结束日期为空,则“新添加”,如果结束日期不为空,则“工作已结束”,如果开始日期为小于报告日期然后“现有打开”。问题是这些取决于报告日期和打开/关闭日期之间的相关性。我需要能够按日期分组并给出每天的计数。我试过这些2 个解决方案并没有像我希望的那样工作,因为它们与我的方案略有不同。(按日期计算多列上的函数(SQL Server)获取两个不同日期列的计数并按日期分组)。当我冷静下来时,我需要根据当前日期的库存和前一天的现有资料每天进行清点。

我的基本数据结构是这样的,是假数据:

+----+------------+-----------+---+
| ID | StartDate  |  EndDate  |   |
+----+------------+-----------+---+
|  1 | 1/1/2020   |  NULL     |   |
|  2 | 12/1/2019  | 1/1/2020  |   |
|  3 | 1/1/2020   |  1/3/2020 |   |
|  4 | 12/17/2019 | 1/2/2020  |   |
+----+------------+-----------+---+

预期结果:

+-------------+---------+-----------------+-----------+--+--+------+
| Report Date | NewAdds |    ExistingOpen |    Closed |  |  |      |
+-------------+---------+-----------------+-----------+--+--+------+
| 1/1/2020    |       2 |          1       |         1 |  |  |    |
| 1/2/2020    |       0 |          1      |         1 |  |  |     |
| 1/3/2020    |       0 |          1      |         1 |  |  |     |
+-------------+---------+-----------------+-----------+--+--+------+

标签: sql-server

解决方案


set @report_start = '20200101';
set @report_end = '20200103';

select
    d.dt,
    count(case when t.start_dt = d.dt then 1 end) as Adds,
    count(case when d.dt > t.start_dt and d.dt < t.end_dt as Existing,
    count(case when t.end_dt = d.dt then 1 end) as Closed
from T t inner join Dates d on d.dt <= coalesce(t.end_dt, @report_end)
where d.dt between @report_start and @report_end
group by d.dt;

创建一个日期表并加入它。在这一点上计数是相当容易的。

这是一个坏主意,因为您需要计算所有日期。我也不知道空结束日期是什么意思。抱歉,如果这是我在手机上输入时的草率。


推荐阅读