Добавьте рабочие дни в другую таблицу, используя таблицу дат в SQL - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть две таблицы со значениями:

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

Я хочу добавить 3 рабочих дня с даты FieldValue в новый столбец: NewFieldValue для этой строки.

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

Я не могу понять, как использовать 2 таблицы, чтобы получить следующий результат:

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

1 Ответ

2 голосов
/ 23 апреля 2020

Вы можете использовать row_number(), чтобы узнать nth рабочий день от вашей базовой даты

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

Примечание: не конвертируйте дату в строку для сравнения.

PS: вы должны объяснить, что такое B и W. Хотя вполне очевидно, что это «Бизнес и выходные», но, тем не менее, понятнее объяснить соответствующие столбцы в вашей таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...