简体   繁体   中英

Add business days to another table using a date table in SQL

I have these 2 tables with values:

create table FieldTable (
    FieldId int,
    FieldName varchar(256),
    FieldValue sql_variant);
go

insert into FieldTable values (1, 'ABC', '04/17/2020');
go

create table DatbeTable (
    Dt date,
    DayType char);
go

insert into DatbeTable values ('2020-04-01','B');
insert into DatbeTable values ('2020-04-02','B');
insert into DatbeTable values ('2020-04-03','B');
insert into DatbeTable values ('2020-04-04','W');
insert into DatbeTable values ('2020-04-05','W');
insert into DatbeTable values ('2020-04-06','B');
insert into DatbeTable values ('2020-04-07','B');
insert into DatbeTable values ('2020-04-08','B');
insert into DatbeTable values ('2020-04-09','B');
insert into DatbeTable values ('2020-04-10','B');
insert into DatbeTable values ('2020-04-11','W');
insert into DatbeTable values ('2020-04-12','W');
insert into DatbeTable values ('2020-04-13','B');
insert into DatbeTable values ('2020-04-14','B');
insert into DatbeTable values ('2020-04-15','B');
insert into DatbeTable values ('2020-04-16','B');
insert into DatbeTable values ('2020-04-17','B');
insert into DatbeTable values ('2020-04-18','W');
insert into DatbeTable values ('2020-04-19','W');
insert into DatbeTable values ('2020-04-20','B');
insert into DatbeTable values ('2020-04-21','B');
insert into DatbeTable values ('2020-04-22','B');
insert into DatbeTable values ('2020-04-23','B');
insert into DatbeTable values ('2020-04-24','B');
insert into DatbeTable values ('2020-04-25','W');
insert into DatbeTable values ('2020-04-26','W');
insert into DatbeTable values ('2020-04-27','B');
insert into DatbeTable values ('2020-04-28','B');
insert into DatbeTable values ('2020-04-29','B');
insert into DatbeTable values ('2020-04-30','B');
go

I want to add 3 business days from the FieldValue date to the new column: NewFieldValue for that row.

select 
    FieldId, 
    FieldName,
    FieldValue--,
    --NewFieldValue
into #temp
from FieldTable ft
join DatbeTable d
    on format(try_convert(date, ft.FieldValue), 'd', 'en-us') = format(try_convert(date, d.Dt), 'd', 'en-us');
go

I can't really figure out how to use the 2 tables to get this below result:

FieldId FieldName   FieldValue  NewFieldValue
------- ---------   ----------  -------------
1       ABC         04/17/2020  04/22/2020

You can use row_number() to find out the nth business day from your base date

select 
        FieldId, 
        FieldName,
        FieldValue, 
        d.Dt as NewFieldValue
from    FieldTable ft
        cross apply 
        (
            select  x.Dt, day_no = row_number() over (ORDER BY x.Dt)
            from    DatbeTable x
            where   x.Dt        > try_convert(date, ft.FieldValue)
            and     x.DayType   = 'B' -- business day only
        ) d
where   d.day_no    = 3 -- add 3 business days

Note: Don't convert the date to string for comparison.

PS: you should explain what is B and W . Thought it is pretty obvious that it is Business and Weekend but nevertheless, it is clearer if explain the related columns in your table.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM