使用SQL统计用户输入日期范围内的并发日期

使用SQL统计用户输入日期范围内的并发日期,sql,sql-server,Sql,Sql Server,用户将输入一个日期范围,我想在SQL中输出每个日期,包括该范围内的所述设备的并发使用次数 在本例中,用户日期范围为2016年8月3日至2016年9月3日,因此您可以在下面看到我在这些日期上或之间按类别分组的任何内容,但我在这里仅使用了“powerchair”进行了简化 表模式如下所示 trans_date | trans_end_date | eq_category 17/03/2016 | 16/10/2016 | POWERCHAIR 08/08/2016 | 08/08/2016

用户将输入一个日期范围,我想在SQL中输出每个日期,包括该范围内的所述设备的并发使用次数

在本例中,用户日期范围为2016年8月3日至2016年9月3日,因此您可以在下面看到我在这些日期上或之间按类别分组的任何内容,但我在这里仅使用了“powerchair”进行了简化

表模式如下所示

trans_date | trans_end_date | eq_category
17/03/2016 | 16/10/2016     | POWERCHAIR
08/08/2016 | 08/08/2016     | POWERCHAIR
12/08/2016 | 12/08/2016     | POWERCHAIR
17/08/2016 | 18/08/2016     | POWERCHAIR
22/08/2016 | 22/08/2016     | POWERCHAIR
26/08/2016 | 26/08/2016     | POWERCHAIR
02/09/2016 | 02/09/2016     | POWERCHAIR
我想输出

date       | concurrent_use
03-08-2016 |    1
04-08-2016 |    1
05-08-2016 |    1
06-08-2016 |    1
07-08-2016 |    1
08-08-2016 |    2
09-08-2016 |    1
10-08-2016 |    1
11-08-2016 |    1
12-08-2016 |    2
13-08-2016 |    1
14-08-2016 |    1
15-08-2016 |    1
16-08-2016 |    1
17-08-2016 |    2
18-08-2016 |    2
19-08-2016 |    1
20-08-2016 |    1
21-08-2016 |    1
22-08-2016 |    2
23-08-2016 |    1
24-08-2016 |    1
25-08-2016 |    1
26-08-2016 |    2
27-08-2016 |    1
28-08-2016 |    1
29-08-2016 |    1
30-08-2016 |    1
31-08-2016 |    1
01-09-2016 |    1
02-09-2016 |    2
03-09-2016 |    1
任何1或0,我可以过滤掉,因为那天一定没有任何设备同时出现


我不认为这是一个空白/孤岛问题,但我试图在SQL语句中得到它,这是一个空白。

您需要一组数字或日期。因此,如果您想要该范围内的所有内容:

with d as (
      select cast('2016-08-03' as date) as d
      union all
      select dateadd(day, 1, d.d)
      from d
      where d < '2016-09-03'
     )
select d.d, count(s.trans_date)
from d left join
     schema s
     on d.d between s.trans_date and s.trans_date_end
group by d.d;

我不确定开始日期和结束日期是否都包含在范围内。

请尝试下面的方法。您需要使用递归cte生成日期。然后,我们需要计算每个日期在该范围内发生的次数

     ;WITH CTE
     AS (SELECT CONVERT(DATE, '2016-08-03', 103) DATE1
         UNION ALL
         SELECT Dateadd(DAY, 1, DATE1) AS DATE1
         FROM   CTE
         WHERE  Dateadd(DD, 1, DATE1) <= '2016-09-03')
SELECT C.DATE1,
       Count(1) OCCURENCES
FROM   CTE C
       JOIN #TABLE1 T
         ON C.DATE1 BETWEEN [TRANS_DATE] AN [TRANS_END_DATE]
GROUP  BY C.DATE1 

似乎就是这个,干杯!必须将日期转换为日期,因为“我的日期”字段也包含一天中的时间,但除此之外,其他字段按预期工作。