Вычисление начала и конца недели по номеру на SQL

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Начнём сразу с обсуждения SQL-запросов, позволяющих определить начало (понедельник) и конец (воскресенье) выбранной ISO-недели и соответствующего года:

Начало недели:

SQL
Скопировать код
-- Подставьте вместо @Year и @WeekNumber конкретные значения
SELECT DATEADD(week, @WeekNumber – 1, DATEADD(day, 1 – DATEPART(weekday, DATEFROMPARTS(@Year, 1, 1)), DATEFROMPARTS(@Year, 1, 1))) AS StartDate

Конец недели:

SQL
Скопировать код
-- Время для отдыха!
SELECT DATEADD(day, 6, DATEADD(week, @WeekNumber – 1, DATEADD(day, 1 – DATEPART(weekday, DATEFROMPARTS(@Year, 1, 1)), DATEFROMPARTS(@Year, 1, 1)))) AS EndDate

Замените @Year и @WeekNumber на необходимые значения. Если ваша неделя начинается в другой день, скорректируйте 1 в выражении 1 – DATEPART.

Кинга Идем в IT: пошаговый план для смены профессии

За пределами сцены: подробный разбор работы с датами в SQL

Понедельник – день объявления переменных

Функции DATEADD и DATEPART облегчают работу SQL Server с датами. Не забывайте проверять параметр @@DATEFIRST, определяющий, с какого дня начинается неделя в вашем SQL Server.

SQL
Скопировать код
-- По умолчанию SQL Server считает воскресенье первым днём недели.
-- Изменим это, сделав первым днём понедельник.
SET DATEFIRST 1;

Применение DATEPART и DATEADD для точных расчётов

DATEPART возвращает порядковый номер дня недели, что помогает вычислить, сколько дней следует добавить или вычесть, чтобы определить начало или конец недели.

DATEADD служит для изменения даты путём добавления к ней заданного числа интервалов времени, таких как дни, недели, месяцы.

SQL
Скопировать код
-- На следующей неделе устроим праздник!
SELECT DATEADD(week, 1, GETDATE()) AS OneWeekFromNow;

Гибкость — использование переменных вместо строго заданных дат

Используйте переменные или параметры даты для большей гибкости каждого запроса:

SQL
Скопировать код
DECLARE @Year INT, @WeekNumber INT;
SET @Year = 2023;        
SET @WeekNumber = 15;

Различные настройки DATEFIRST и корректная работа SQL-скрипта

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

Визуализация

Пример: начало и конец 15-ой недели в ISO-системе

SQL Server незамедлительно предоставит начальную и конечную даты для 15-ой недели 2023 года:

SQL
Скопировать код
-- Собираемся в путешествие на 15-ую неделю?
DECLARE @Year INT = 2023, @WeekNumber INT = 15;
SELECT 
    DATEADD(day, 1 – DATEPART(weekday, DATEFROMPARTS(@Year, 1, 1)), 
    DATEADD(week, @WeekNumber – 1, DATEFROMPARTS(@Year, 1, 1))) AS StartDate;

Путешествие во времени становится проще, когда у каждой недели чётко обозначены границы!

Адаптация скрипта к нестандартным системам нумерации недель и високосным годам

Високосные годы – не причина для беспокойства!

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

Разные системы нумерации недель требуют дополнительного внимания

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

Полезные материалы