强制sql结果返回每个日期,即使它不在数据库中

时间:2012-11-12 20:44:37

标签: sql sql-server-2005

  

可能重复:
  generate days from date range

这是我的问题:

SELECT SUM(number) AS number, c_date 
    FROM my_table 
    WHERE c_date between '11/6/2012' AND '11/12/2012' 
    GROUP BY c_date 
    ORDER BY c_date DESC

它将返回类似这样的内容

11    '11/12/2012'
9     '11/9/2012'
10    '11/8/2012'
10    '11/7/2012'
10    '11/6/2012'

现在我如何强制返回结果包含11/11和11/10,其中数字为0,而不是完全跳过它们。此外,我无法创建日期表来存储日期。

2 个答案:

答案 0 :(得分:0)

由于您无法创建新表an alternate approach is to build up a "calendar" CTE

接下来,从新创建的“日历”表格中LEFT JOIN执行my_table

SELECT ISNULL(SUM(mt.number), 0) AS number, mc.c_date 
FROM 
    my_calendar mc LEFT JOIN
    my_table mt ON mt.c_date = mc.c_date
WHERE mc.c_date between '11/6/2012' AND '11/12/2012' 
GROUP BY mc.c_date 
ORDER BY mc.c_date DESC

答案 1 :(得分:0)

您可以创建一个返回日期范围的用户定义函数。它看起来像这样:

CREATE FUNCTION uspDateRange(@MinDate datetime, @Maxdate datetime)
RETURNS @DateRange TABLE ([Date] datetime)
AS
BEGIN
    DECLARE @Date datetime

    SET @Date = @MinDate

    WHILE (@Date < @MaxDate)
    BEGIN
        INSERT INTO @DateRange VALUES(@Date)
        SET @Date = DATEADD(day, 1, @Date)
    END

    RETURN
END
GO

现在,您可以选择一个范围来获取2012年10月所有日期的范围:

SELECT * FROM uspDateRange('2012-10-01', '2013-11-01')

您的查询将如下所示:

SELECT SUM(number) AS number, c_date 
    FROM my_table t
    INNER JOIN uspDateRange('11/6/2012', '11/12/2012') r ON t.c_date = r.[Date]
    GROUP BY c_date     
    ORDER BY c_date DESC