计算每天SQL Server 2012的日期范围计数

时间:2013-11-29 13:17:57

标签: sql sql-server performance sql-server-2012

我无法获取以下

的记录
 | DATEFROM     | DATETO
 | 2012-01-02   | 2012-01-03
 | 2012-01-11   | 2012-01-16
 | 2012-01-08   | 2012-01-22
 | 2012-01-29   | 2012-01-30
 | 2012-01-08   | 2012-01-11

我正在尝试从第一个范围的最后一个日期结束的第一个范围开始,计算包含每天日期的范围。

示例输出:

2012-01-02 | 1
2012-01-03 | 1
2012-01-08 | 2
2012-01-09 | 2
2012-01-10 | 2
2012-01-11 | 3
2012-01-12 | 2
2012-01-13 | 2
2012-01-14 | 2
2012-01-15 | 2
2012-01-16 | 2
......

我的数据库包含从2008年到现在的数据。

换句话说,我试图获取特定日期的记录数。 并非每天都在TABLE每个月

我发现此帖Tricky mysql count occurrences of each day within date range但无法转换提供给我的SQL Server 2012的代码。

你可以试试这里 http://sqlfiddle.com/#!6/0855b/1

1 个答案:

答案 0 :(得分:4)

好的,这是做你想做的事的一种方法:

DECLARE @MinDate DATE, @MaxDate DATE;

SELECT  @MinDate = MIN(DATEFROM),
        @MaxDate = MAX(DATETO)
FROM ENTRIES;

WITH Dates AS
(
    SELECT DATEADD(DAY,number,@MinDate) [Date]
    FROM master.dbo.spt_values
    WHERE type = 'P'
    AND number > 0
    AND DATEADD(DAY,number,@MinDate) <= @MaxDate
)
SELECT  A.[Date],
        COUNT(*) N
FROM Dates A
LEFT JOIN Entries B
    ON A.[Date] >= B.DATEFROM 
    AND A.[Date] <= B.DATETO
GROUP BY A.[Date]
ORDER BY A.[Date]

如果范围日期超过2047天,那么您需要创建的值多于master.dbo.spt_values中可用的值(这是微不足道的,例如您可以使用CROSS JOIN

Here is the sqlfiddle让你尝试。