KriShna RaJendra N PraSad Ответов: 1

Дорогие друзья у меня есть задача показать дату рабочего дня с помощью SQL.


Команда,

*У меня есть список праздников в таблице Sql.
*У меня есть 2 услуги 1 и 2.
*Для услуги 1 нужно добавить 30 дней на созданную дату.
*Для услуги 2 нужно добавить 5 дней на созданную дату.

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

Что я уже пробовал:

SQL Table


Date_Fmt	Holiday_Name
2020-10-10	Basava Jayanthi
2020-10-12	Krishna Jayanthi
2020-10-15	Mahaveer Jayanthi
2020-10-18	Dipavali
2020-10-22	Dasara


пробовал несколько печатных листов, не получится

Richard MacCutchan

Пожалуйста, используйте Улучшить вопрос ссылка выше и добавьте код, который вы пробовали, и объясните, что происходит, когда вы его запускаете.

Richard Deeming

Вы хотите переместить конечную дату, если она попадает на праздничную дату, или вы хотите добавить 5 нерабочих дней к начальной дате?

Например: если начальная дата 2020-10-07, добавив пять дней, вы получите 2020-10-12- Вы хотите перенести это в другое место? 2020-10-13, так как он приземляется непосредственно на Кришна Джаянти, игнорируя тот факт, что эти пять дней также включают в себя Следующих Basava Или вы хотите принять во внимание оба праздника и переместить результат в другое место ? 2020-10-14 вместо этого?

KriShna RaJendra N PraSad

Да он и не должен двигаться, если праздник приходится на 2020-10-13 годы. Он должен дать следующую рабочую дату. дата, которой нет в списке праздников. Заранее спасибо.

1 Ответов

Рейтинг:
7

Tan Chee Yong

Предположим, что ваше имя таблицы-TBL_Holidays, а суббота, воскресенье-нерабочие дни
Вы можете попробовать это сделать, чтобы получить рабочую дату:

DECLARE @NoOfWorkingDays INT;
SET @NoOfWorkingDays = 5;

DECLARE @StartDate DATE
SET @StartDate = '20201001'
DECLARE @CurrDate datetime;
DECLARE @Counter INT; 
DECLARE @DayAdd INT; 
SET @Counter=0;
SET @DayAdd =1;
WHILE (@Counter < @NoOfWorkingDays)
BEGIN
	SET @CurrDate = DATEADD(DAY,@DayAdd,@StartDate);
	If DATENAME(dw, @CurrDate) NOT IN ('Saturday', 'Sunday')
	   AND (@CurrDate NOT IN (SELECT Date_FMT FROM TBL_Holidays))
		SET @Counter  = @Counter  + 1;
	SET @DayAdd  = @DayAdd  + 1;
END
SELECT @CurrDate;


Tan Chee Yong

Я буду считать, что 30 дней и 5 дней-это рабочие дни. Если это календарные дни, выполните функцию dateadd и проверьте, является ли это рабочим днем, а не в праздничной таблице, если это не так, сделайте цикл, добавляя 1 день каждый раз, чтобы проверить, пока это не рабочий день

KriShna RaJendra N PraSad

Спасибо за ваш повтор и решение.

Вот это правительственное учреждение, так что праздники будут на все воскресенье, 2-ю и 4-ю субботу и некоторые другие фиксированные праздники, которые являются фестивалями. У меня есть таблица, которая содержит весь список праздников, включая все воскресенье, 2-ю, 4-ю субботу и праздничные праздники. Я попробовал ниже запрос, и я получаю одну дату, но если эта дата находится в списке праздников, то мне нужна дата, которая не находится в списке праздников.

выберите Convert(тип char(10), ДТ+(выбрать количество(*) из Holiday_list где Date_Fmt между School_update и ДТ ),103) УНТ от (
выберите case when Service_TypeID='1' then (School_update + 30) else (School_update + 5) end as dt,School_update from Application_Status)a

заранее спасибо.

Tan Chee Yong

Если нерабочий находится в таблице, а 30 и 5-календарные дни, вы можете попробовать приведенный ниже sql-код

DECLARE @StartDate DATE
SET @StartDate = '20201007'

DECLARE @ServiceType INT;
SET @ServiceType = 1;

DECLARE @NoOfWorkingDays INT;
If @ServiceType = 1
	SET @NoOfWorkingDays = 30
ELSE 
	SET @NoOfWorkingDays = 5;

DECLARE @Counter INT; 
DECLARE @DayAdd INT; 
SET @DayAdd =1;

DECLARE @CurrDate datetime;
SET @CurrDate = DATEADD(DAY,@NoOfWorkingDays,@StartDate);

IF (@CurrDate IN (SELECT Date_FMT FROM TBL_Holidays))
BEGIN
	SET @CurrDate = DATEADD(DAY,1,@CurrDate);
	WHILE (@CurrDate IN (SELECT Date_FMT FROM TBL_Holidays))
	BEGIN
		SET @CurrDate = DATEADD(DAY,1,@CurrDate);
	END
END
SELECT @CurrDate;

KriShna RaJendra N PraSad

Большое вам спасибо, сэр, за ваше быстрое решение. одна небольшая справка дата начала находится в другой таблице имя таблицы называется Application_Status а имя столбца School_update

Tan Chee Yong

вы можете использовать что-то вроде

SET @StartDate = (SELECT School_update FROM Application_Status);

KriShna RaJendra N PraSad

Огромное спасибо...