小编典典

使用SQL查询,如何选择范围内的每个日期?

sql

我正在查询支持凭单数据库,并且每个凭单都有一个列“打开日期”和“关闭日期”。票证经常保持开放状态多天,因此我们需要能够拉出每天开放的票证数量。
例如,对于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)。路。


阅读 192

收藏
2021-04-14

共1个答案

小编典典

您的问题对我来说不是很清楚,但是使用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

2021-04-14