【发布时间】:2020-05-08 12:31:03
【问题描述】:
我有一个关于 SQL 重叠的问题,我的数据库中有以下结构和数据:
Table A (Id = uniqueidentifier)
| Name | StartDate | EndDate | DaysToReceive |
------------------------------------------------------
| A | 2019-08-26 | 2020-04-13 | 232 |
| A | 2019-12-15 | 2020-04-11 | 119 |
| A | 2020-03-06 | 2020-03-31 | 26 |
| B | 2020-01-07 | 2020-01-31 | 25 |
| B | 2020-02-11 | 2020-02-29 | 19 |
我需要获取接收日期,但如果有重叠,我需要最小日期和最大日期之间的差异,否则我使用 DaysToReceive 求和列。
我试图让结果看起来像这样:
| Name | DaysToReceive |
------------------------
A | 232
B | 44
我已设法获得此查询,但仅适用于重叠日。
select DATEDIFF(d, MIN(t1.dt),MAX(t1.enddt)) + 1 as DaysToReceive
from (
select distinct cp1.dt, min(cp2.dt) enddt
from ( select StartDate as dt, Id from TableA ) cp1,
( select EndDate as dt from TableA ) cp2
where cp2.dt > cp1.dt cp1.Id = cp2.Id
group by cp1.dt
) t1, TableA t2
where t2.StartDate between t1.dt and t1.enddt
group by t1.dt, t1.enddt
提前致谢。 干杯
【问题讨论】:
-
用您正在使用的数据库标记您的问题。我还建议您添加一个 db/SQL 小提琴。这不是一个小问题。
-
你确定
A的值 232 是正确的吗?这是怎么回事:| A | 2019-08-26 | 2019-04-13 | 232 |与| A | 2020-03-06 | 2020-03-31 | 26 |重叠 -
@kebek 是的,因为当我保存时我会计算开始日期和结束日期之间的差异,但因为
2020-03-06 | 2020-03-31在重叠范围内(2019-08-26 | 2019-04-13)我不需要这个值。 -
A的开始日期的第一条和第二条记录在结束日期之后?
-
@Srinika,小费不好。现在是 2020 年。
标签: sql overlap sql-server-2017