В SQL добавление двух дней и дата результата должна быть рабочим днем - PullRequest
1 голос
/ 05 мая 2019

У меня есть таблица календаря с несколькими полями, из которых поля ниже полезны, и я хочу добавить в таблицу новый столбец «Дата обещания» с приведенной ниже логикой.Я борюсь с этим и нуждаюсь в помощи.

Пример: Дата начала = '01 -02-2019 ', а затем добавьте два дня.Результатом должен стать рабочий день.

Имя таблицы: = Таблица дат

Дата начала, IsBillingday = 1 (исключая праздничные и выходные дни), WeekdayFlag = День недели, DayNameOfWeekShort = 'Пн' .... Пятница.

Сначала начал думать просто ...

CASE WHEN DayNameOfWeekShort = 'Mon' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Tue' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Wed' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Thu' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 4 , dbo.DateTable.StartDate) , 23) 
WHEN DayNameOfWeekShort = 'Fri' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 5 , dbo.DateTable.StartDate) , 23) ELSE '' END

Но тогда результат в некоторых случаях не рабочий день ... Как перейти на следующий рабочий день?

Для этой строки

CASE WHEN DayNameOfWeekShort = 'Mon' AND ISBillingDay = '1' THEN CONVERT (nvarchar(10) , DATEADD(Day , 2 , dbo.DateTable.StartDate) , 23)

Результат не рабочий день ... Тогда нужно добавить +1 день и проверить, работает ли рабочий день или нет ... Если не добавить + 1 ... Если да .. конецпетля.а

1 Ответ

1 голос
/ 05 мая 2019

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

Логика будет выглядеть следующим образом:

select c.*,
       min(case when c.isworkingday = 1 then c.date end) over
           (order by c.date
            rows between 2 following and unbounded following)
           ) as next_workingday_plus_2
from calendar c;

Обратите внимание, что вы должны хранить даты как даты , а не какстроки, особенно в календарной таблице (если у вас нет одного или нескольких столбцов с датами в определенном формате).

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