首页 > 解决方案 > 如何获取日期范围之间的所有日期(包括 start_date 和 end_date)

问题描述

如何获取 start_date 和 end_date 之间的所有日期,包括 start_date 和 end_date?

但不是那些不在该范围内的日期。

例如: 08-01-2020 不应出现在输出中,因为它不在任何 work_id 日期范围内,因此 08-01-2020 是非工作日期之一

所以我想要除非工作日期之外的所有日期。

样品表: 在此处输入图像描述

样本输出:要么这个

在此处输入图像描述

或这个

在此处输入图像描述

标签: sqlsql-server

解决方案


首先,您应该创建一个表值函数,为表中的每个条目生成日期列表

CREATE FUNCTION DatesByRange(@start_date date, @end_date date)
    RETURNS @Dates TABLE 
    (
        Dates date
    )
AS
BEGIN
    
    WITH cteDateRanges AS
    (
        SELECT @start_date AS workday
        UNION ALL
        SELECT DATEADD(DAY, 1, workday) FROM cteDateRanges
        WHERE workday < @end_date
    )

    INSERT INTO @Dates
    SELECT workday FROM cteDateRanges

    RETURN;
END;

然后您可以将此功能与交叉应用一起使用

SELECT DISTINCT x.* FROM YourTable
CROSS APPLY(SELECT * FROM dbo.DatesByRange(t.start_date, t.end_date)) x

推荐阅读