我有一张看起来像这样的表
id | Submit_Date | Close_Date
------------------------------
1 | 2015-02-01 | 2015-02-05
2 | 2015-02-02 | 2015-02-04
3 | 2015-02-03 | 2015-02-05
4 | 2015-02-04 | 2015-02-06
5 | 2015-02-05 | 2015-02-07
6 | 2015-02-06 | 2015-02-07
7 | 2015-02-07 | 2015-02-08
我可以计算一下特定日期开放的票数:
Select count(*) from tickets where '2015-02-05' BETWEEN Submit_Date and Close_Date
这给了我4
,但我需要一个月中每一天的这个数。我不想写30个查询来处理这个问题。有没有办法捕获多天的故障?
答案 0 :(得分:1)
我使用@Heinzi的解决方案与来自Generate a resultset of incrementing dates in TSQL
的技巧混合创建了一个解决方案declare @dt datetime, @dtEnd datetime
set @dt = getdate()
set @dtEnd = dateadd(day, 100, @dt)
SELECT dates.myDate,
(SELECT COUNT(*)
FROM tickets
WHERE myDate BETWEEN Submit_Date and Close_Date
)
FROM
(select Dates_To_Checkselect dateadd(day, number, @dt) mydate
from
(select distinct number from master.dbo.spt_values
where name is null
) n
where dateadd(day, number, @dt) < @dtEnd) dates
代码是从记忆中合并而来的,我没有把它放在我面前所以可能会有一些拼写错误
答案 1 :(得分:0)
首先,您需要一个包含您要检查的每个日期的表格。您可以使用临时表。我们假设此表名为Dates_To_Check
并且有一个字段myDate
:
SELECT myDate,
(SELECT COUNT(*)
FROM tickets
WHERE myDate BETWEEN Submit_Date and Close_Date)
FROM Dates_To_Check
或者,您可以create a huge table containing every possible date并使用WHERE子句将日期限制为您感兴趣的人。
答案 2 :(得分:0)
如果您使用的是SQL Server 2012或更高版本,您可以使用窗口函数执行此操作,其中一个小技巧,您可以在开放日期-1到结束日期添加1,然后执行此总额的运行总计:
select distinct date, sum(opencnt) over (order by date) from (
select
Submit_Date as date,
1 as opencnt
from
ticket
union all
select
dateadd(day, 1, Close_Date),
-1
from
ticket
) TMP
有一个dateadd + 1天来包含当天的截止日期
答案 3 :(得分:0)
您可以生成日期列表,然后检索日期集中每个日期的计数。
cte部分从年初开始生成日期列表(ssumption),下一部分从数据集中计算出计数。
with cte as
(select cast('2015-01-01' as date) dt // you should change this part to the correct start date
union all
select dateadd(DD,1,dt) dt from cte
where dt<getdate()
)
select count(*)
from tickets
inner join cte
on cte.dt between Submit_Date and Close_Date
group by cte.dt