SQL 服务器 - 计算用户拥有有效合同的总天数

SQL Server - Counting total number of days user had active contracts

我想根据每个服务合同的开始和结束日期,根据 table 计算用户拥有有效合同的天数。我想计算任何 activity 的时间,无论客户是否同时激活了 1 个或 5 个合约。

+---------+-------------+------------+------------+
| USER_ID | CONTRACT_ID | START_DATE |  END_DATE  |
+---------+-------------+------------+------------+
|       1 |          14 | 18.02.2021 | 18.04.2022 |
|       1 |          13 | 02.01.2019 | 02.01.2020 |
|       1 |          12 | 01.01.2018 | 01.01.2019 |
|       1 |          11 | 13.02.2017 | 13.02.2019 |
|       2 |          23 | 19.06.2021 | 18.04.2022 |
|       2 |          22 | 01.07.2019 | 01.07.2020 |
|       2 |          21 | 19.01.2019 | 19.01.2020 |
+---------+-------------+------------+------------+

结果我想要 table:

+---------+--------------------+
| USER_ID | DAYS_BEEING_ACTIVE |
+---------+--------------------+
|       1 |               1477 |
|       2 |                832 |
+---------+--------------------+

在哪里

1477 等于 1053(从 2017 年 2 月 13 日到 2020 年 1 月 2 日 - 用户在此期间有有效合同)+ 424(从 2021 年 2 月 18 日到 2022 年 4 月 18 日)

832 等于 529(从 19.01.2019 到 01.07.2020 的天数)+ 303(从 19.06.2021 到 18.04.2022 的天数)。

我尝试了一些带有连接、datediff、case when 条件的查询,但没有任何效果。我将不胜感激。

如果您没有 Tally/Numbers table(强烈推荐),您可以使用 ad-hoc tally/numbers table

示例或dbFiddle

Select User_ID
      ,Days = count(DISTINCT dateadd(DAY,N,Start_Date))
 from  YourTable A
 Join ( Select Top 10000 N=Row_Number() Over (Order By (Select NULL)) 
         From master..spt_values n1, master..spt_values n2
      ) B
  On N<=DateDiff(DAY,Start_Date,End_Date)  
 Group By User_ID

结果

User_ID     Days
1           1477
2           832