sql - 如何获取日期范围之间的所有日期(包括 start_date 和 end_date)
问题描述
如何获取 start_date 和 end_date 之间的所有日期,包括 start_date 和 end_date?
但不是那些不在该范围内的日期。
例如: 08-01-2020 不应出现在输出中,因为它不在任何 work_id 日期范围内,因此 08-01-2020 是非工作日期之一
所以我想要除非工作日期之外的所有日期。
样本输出:要么这个
或这个
解决方案
首先,您应该创建一个表值函数,为表中的每个条目生成日期列表
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
推荐阅读
- arrays - 如何获取数组元素的序列?
- xamarin.forms - 如何用不同的颜色绘制选择的项目?
- angular - 如何在Angular7的不同选项卡中导航回上一个路线/页面?
- amazon-web-services - AWS Cloudfront 自定义错误页面是否很慢?
- node.js - 检查电子邮件是否存在续集(节点js)的正确方法?
- python - 在 Python/Kivy 应用程序中保存用户名和密码
- sas - SAS 按组求和,然后为每个组创建新变量
- assembly - 如何正确将此字节值存储在内存中?
- sql-server - 在 Azure DevOps 管道上生成 SQL Server 架构更改脚本
- python - 如何在保留标题的同时翻转 csv 行顺序?