如何获取日期范围(包括开始日期和结束日期)之间的所有日期

时间:2020-07-31 11:38:02

标签: sql sql-server

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

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

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

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

样品表: enter image description here

样本输出: 要么这个

enter image description here

或这个

enter image description here

2 个答案:

答案 0 :(得分:0)

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

cd ~/catkin_ws/src/
git clone https://github.com/ahornung/humanoid_msgs.git
cd ../
catkin_make 

  

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

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;

答案 1 :(得分:0)

创建目标范围日期列表,向列表中添加工作和非工作标志,然后按标志进行过滤。 您可以通过以下查询获得预期的输出。

-- 1st, generate a list of dates
with dates as (
select min(start_date) as dates, max(end_date) as max_date from dates_range
union all
select dateadd(day, 1, dates), max_date from dates
where dates < max_date
),
-- 2nd, generate a list of dates with working/non working flag
all_dates as (
select distinct
  d1.dates,
  case when d2.work_id is not null then 'true' else 'false' end as working
  from dates as d1 left outer join dates_range as d2
  on d1.dates between d2.start_date and d2.end_date
)
-- 3rd, filter either that working is true or false
select dates as Non_working_dates from all_dates where working = 'false';

db<>fiddle