amine zawix Ответов: 2

Есть ли способ не использовать некоторое время в этом случае?


select @numberOfDays = -@number_of_days;
 select @startDate = getdate(); 

WHILE @numberOfDays < 0

   begin

      select @startDate = dateadd(dd, -1, @startDate);

      IF (((datepart(weekday, @startDate) + @@datefirst - 2) % 7 + 1 ) = 7)   
	  begin
	  select @startDate = dateadd(dd, -1, @startDate) ;
	  end;

      IF (((datepart(weekday, @startDate) + @@datefirst - 2) % 7 + 1 ) = 6) 
	  begin
	  select @startDate = dateadd(dd, -1, @startDate) ;
	  end;

      select @numberOfDays = @numberOfDays + 1 ;

end;


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

Я не хочу использовать некоторое время в sql SP по очевидным причинам.

OriginalGriff

Зависит. Что ты пытаешься сделать?

amine zawix

Эй, я пытаюсь вычесть рабочие дни из текущей даты.

2 Ответов

Рейтинг:
6

Maciej Los

В зависимости от того, что вы имеете в виду, говоря о рабочих днях.
Что касается меня, то рабочий день-это день, когда мне нужно идти на работу (работу). Это не значит: с понедельника по пятницу. Это значит: с понедельника по пятницу, исключая праздничные дни. В каждой стране очень много праздников. Видеть: Праздник - Википедия[^]

Итак, если вы хотите получить количество рабочих дней с понедельника по пятницу в определенном диапазоне дат, проверьте это: sql - подсчет рабочих дней между двумя датами - переполнение стека[^]

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

В случае, если вы хотите получить список рабочих дней в диапазоне дат, вы можете использовать КТОС[^]. Например:

DECLARE @numberOfDays INT = 55
DECLARE @startDate DATE = GETDATE()

;WITH WorkingDays AS
(
	--initial part
	SELECT @startDate AS WorkingDate, 0 AS NoOfDays, DATEPART(DW, @startDate) AS PartOfWeek
	--recursive part
	UNION ALL
	SELECT DATEADD(DAY, 1,  WorkingDate) AS WorkingDate, NoOfDays +1  As NoOfDays, DATEPART(DW, DATEADD(DAY, 1,  WorkingDate)) AS PartOfWeek
	FROM WorkingDays
	WHERE NoOfDays < @numberOfDays 
)
SELECT * --WorkingDate
FROM WorkingDays 
WHERE PartOfWeek <> 1 AND PartOfWeek <> 7


Рейтинг:
14

OriginalGriff

Цитата:
Эй, я пытаюсь вычесть рабочие дни из текущей даты.

Ну и что? Зачем использовать петлю?
Все, что вам нужно сделать, это смещение от текущего дня назад к началу текущей недели.
Затем вы можете работать обратно в целые недели, разделив то, что осталось, на количество рабочих дней в неделе. Остаток-это дни в конце первой недели, которые необходимо проверить на наличие "рабочих дней"
working days = working days since start of week + complete weeks * working days in whole week + working days in last part of first week.

Вот и все деление: повторное вычитание!