Недавно я унаследовал все требования к отчетности для нового клиента — то, с чем мне не приходилось возиться с самого начала работы в отрасли, когда я поглощал всю работу, которая никому не была нужна. С тех пор я сделал свою долю SQL, но по большей части он был ограничен вашим стандартным CRUD с довольно предсказуемыми шаблонами. Что еще хуже, ORM действительно съели качество времени, которое я раньше тратил на SSMS.

С тех пор, как я взял на себя эту ответственность, я заметил очень распространенную закономерность в запросах пользователей на отчеты. Обычно это происходит примерно так:

«Дайте мне все X до Y рабочих дней назад». — Опытный деловой человек

Так начался мой путь к выяснению того, как справляться с будними днями самым общим и легко поддерживаемым способом. Я изучил концепцию Календарных таблиц, но обнаружил, что они избыточны для требований моего клиента. Вместо этого я начал троллить документацию MSDN, связанную с манипулированием датами и наткнулся на очень удобную функцию под названием DATENAME. Благодаря этому я могу легко вычислить смещение, заданное пользователем, и проверить, попадает ли результат на выходные:

Хотя это решение достаточно хорошо для моих случаев использования, оно не учитывает другие языки, что может стать препятствием для многих из вас. Немного поработав, я смог преобразовать это во что-то более надежное, использующее преимущества функции DATEPART, а также учитывающее настройки @@DATEFIRST, которые будут различаться в зависимости от языка.