T-sql如何在日期范围内没有数据时添加天数

问题描述

我需要一个查询,由于我使用的报告解决方案的限制,它只能是一条select语句,没有cte的函数等,以填充选择日期范围时的天数,并且其中某些值没有值天,这是在图表中显示趋势,并且管理层希望查看整天,即使没有数据也是如此。

请注意,我正在使用日期范围过滤器“从日期”和“到日期”

解决方法

在问题和评论中,我们对您可以(和不能)做的事情有相互矛盾的局限性很多。从“只能是一条选择语句” “没有cte,函数等” ,到“也不能使用视图” 以及“只要选择开始” 的限制。后者意味着,除了CTE外,您可以使用VIEWFUNCTIONJOIN

因此,正如我在第一个评论中建议的那样,制作一个日历表。简单来说:

CREATE TABLE dbo.CalendarTable (CalendarDate date NOT NULL PRIMARY KEY,CalenderYear AS DATEPART(YEAR,CalendarDate) PERSISTED,CalenderMonth AS DATEPART(MONTH,CalenderDay AS DATEPART(DAY,CalenderMonthName AS DATENAME(MONTH,CalendarDate) PERSISTED); --Some example columns

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL))N(N)),Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1,N N2,N N3,N N4),Dates AS(
    SELECT CONVERT(date,DATEADD(DAY,T.I,'20000101')) AS CalendarDate
    FROM Tally T)
INSERT INTO dbo.CalendarTable(CalendarDate)
SELECT CalendarDate
FROM Dates;
GO

SELECT *
FROM dbo.CalendarTable;

然后它就像JOIN一样简单:

SELECT CT.CalendarDate,{Your Other Columns}
FROM dbo.YourTable YT
     JOIN dbo.CalendarTable CT ON YT.StartDate <= CT.CalendarDate
                              AND YT.EndDate >= CT.CalendarDate;