Member 14816845 Ответов: 2

Приходится вычеркивать дни из текущих дней игнорируя выходные


Привет команда, нужна ваша помощь, чтобы получить дату минус 3 дня от currentdate игнорируя СБ и ВС

Например: если сегодня понедельник(4 мая 2020 года) и мне нужно минус три дня и получить дату как четверг (30 апреля 20)

Если сегодня воскресенье (3 мая 20) и мне нужно минус 7 дней и получить дату как четверг(23 апреля 2020 года)

Количество дней минус сохраняется настраиваемым в таблице

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

Я пробовал держать мастер-стол, выдавая удостоверение личности на понедельник, вторник и так далее, но это не сработало

CHill60

Не забудьте использовать "улучшить вопрос", чтобы опубликовать код, который вы уже пробовали

2 Ответов

Рейтинг:
1

CHill60

Лично я предпочитаю иметь календарную таблицу - то, что вы, наверное, называете своей "главной таблицей", и использовать ее. Однако этот пример относительно легко выполнить в одном запросе, если он не особенно эффективен

Вот работающий пример - обратите внимание, что вы должны проверить, что DATEPART(dw .. возвращает параметры вашей культуры и соответствующим образом настраивает запрос

declare @ex1 table (testdate date)
insert into @ex1 (testdate) values
('2020-05-06'),('2020-05-05'),
('2020-05-04'),('2020-05-03'),
('2020-05-02'),('2020-05-01')

declare @days int = -3

SELECT testdate, DATENAME(dw, testdate) as [dayname], DATEPART(dw,testdate) as [daynumber],
	   CASE WHEN DATEPART(dw, DATEADD(d, @days, testdate)) = 1 THEN DATEADD(d, @days - 2, testdate) 
			WHEN DATEPART(dw, DATEADD(d, @days, testdate)) = 7 THEN DATEADD(d, @days - 1, testdate) 
			ELSE DATEADD(d, @days, testdate) END AS WorkingDaysAgo
FROM @ex1
Кроме того, вы можете написать функцию, чтобы сделать это.


Maciej Los

5ed!

Рейтинг:
1

MadMyche

Это выполнимо различными способами; но то, что вы собираетесь сделать в первую очередь, это фактически создать блок-схему или план для правил и логики, чтобы собрать все это вместе.
-Одно правило, которое я могу придумать, будет следующим: Дни если больше или равно 7, то вам придется добавить по крайней мере 2 для 2 выходных дней, которые происходят еженедельно.

MySql действительно имеет несколько функций, которые могут помочь вам на этом пути как для математических функций, так и для функций DateTime.
Одним из них, в частности, будет DayofWeek, который будет принимать дату и возвращать значение 1-7, представляющее воскресенье - субботу.

Как видите... это не будет простой оператор SELECT. Во всей реальности это бизнес-логика функция, которая часто лучше выполняется в приложении, а не в базе данных.

Рекомендации:
MySQL :: MySQL 8.0 справочное руководство :: 12.6 функции даты и времени[^]
MySQL :: MySQL 8.0 Справочное Руководство :: 12.5.1 Арифметические Операторы[^]


Maciej Los

5ed!