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

时间:2014-04-11 20:23:16

标签: sql sql-server date date-range

我正在查询支持服务单数据库,每个故障单都有一个列,用于"日期打开"并且"关闭日期。"门票经常保持开放多天,因此我们需要能够提取每天开放的门票数量。
例如,对于4/8/14,我们需要知道4/8打开了多少张票,再加上4/8之前打开的未关闭票的总数,但仍然在4点钟的上午12:00开放/ 8(在4/8期间或之后可能会或可能不会关闭。)

对于单个日期来说,这似乎很简单,但现在我需要编写一个可以提取完整日期范围的查询。
例如,我们需要编写一个查询,返回2014年1月1日到2014年4月4日之间的每个日期以及每个日期打开的票证总数(包括0票据打开的日期)。

这是否可以仅使用查询或子查询,而不使用任何存储过程或临时数据表? 我们目前正在将数据提取到Excel并计算那里的日期统计数据,但Excel不是可扩展的解决方案,我们希望让SQL执行此工作,以便我们可以将此报告迁移到SSRS(SQL Server报告)服务)在路上。

2 个答案:

答案 0 :(得分:4)

您的问题对我来说不是很清楚,但对于SQLServer 2005或更高版本(SQLServer 2008或类型为Date的更好),您可以创建日历。这是一种方法

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

SQLFiddle

答案 1 :(得分:0)

如果没有某种日期表,每个日期可能包含一行,则无法执行此操作。根据您的RDBMS和您的要求,创建日期表非常简单。