我正在查询支持服务单数据库,每个故障单都有一个列,用于"日期打开"并且"关闭日期。"门票经常保持开放多天,因此我们需要能够提取每天开放的门票数量。
例如,对于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报告)服务)在路上。
答案 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
答案 1 :(得分:0)
如果没有某种日期表,每个日期可能包含一行,则无法执行此操作。根据您的RDBMS和您的要求,创建日期表非常简单。