我正在查询支持凭单数据库,并且每个凭单都有一个列“打开日期”和“关闭日期”。票证经常保持开放状态多天,因此我们需要能够拉出每天开放的票证数量。 例如,对于4/8/14,我们需要知道4/8上已打开多少张票,以及4/8之前已打开但在4的12:00 am仍未打开的未关闭票的总数/ 8(在4/8期间或之后可能已关闭,也可能未关闭)。
对于单个日期来说,这似乎足够简单,但是现在我需要编写一个查询,以获取完整的日期范围。 例如,我们需要编写一个查询,该查询返回14年1月1日至14年10月4日之间的每个日期,以及在每个日期(包括打开0张票证的日期)打开的票证总数。
仅使用查询或子查询,而不使用任何存储过程或临时数据表,这可能吗? 目前,我们正在将数据提取到Excel中并在那里计算日期统计信息,但是Excel不是可扩展的解决方案,我们希望SQL执行此工作,因此我们可以将该报表迁移到向下的SSRS(SQL Server Reporting Services)。路。
您的问题对我来说不是很清楚,但是使用SQLServer 2005或更高版本(对于日期类型为SQLServer 2008或更高版本),您可以创建日历。这是做到这一点的方法
WITH [counter](N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1) , days(N) AS (SELECT row_number() over (ORDER BY (SELECT NULL)) FROM [counter]) , months (N) AS (SELECT N - 1 FROM days WHERE N < 13) SELECT DISTINCT CAST(DATEADD(DAY, days.n, DATEADD(MONTH, months.n, '20131231') ) AS date) FROM months CROSS JOIN days ORDER BY 1
如果您需要更长的时间,请相应地添加新的CTE