Вычисление начала и конца недели по номеру на SQL
Быстрый ответ
Начнём сразу с обсуждения SQL-запросов, позволяющих определить начало (понедельник) и конец (воскресенье) выбранной ISO-недели и соответствующего года:
Начало недели:
-- Подставьте вместо @Year и @WeekNumber конкретные значения
SELECT DATEADD(week, @WeekNumber – 1, DATEADD(day, 1 – DATEPART(weekday, DATEFROMPARTS(@Year, 1, 1)), DATEFROMPARTS(@Year, 1, 1))) AS StartDate
Конец недели:
-- Время для отдыха!
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
.
За пределами сцены: подробный разбор работы с датами в SQL
Понедельник – день объявления переменных
Функции DATEADD и DATEPART облегчают работу SQL Server с датами. Не забывайте проверять параметр @@DATEFIRST
, определяющий, с какого дня начинается неделя в вашем SQL Server.
-- По умолчанию SQL Server считает воскресенье первым днём недели.
-- Изменим это, сделав первым днём понедельник.
SET DATEFIRST 1;
Применение DATEPART и DATEADD для точных расчётов
DATEPART возвращает порядковый номер дня недели, что помогает вычислить, сколько дней следует добавить или вычесть, чтобы определить начало или конец недели.
DATEADD служит для изменения даты путём добавления к ней заданного числа интервалов времени, таких как дни, недели, месяцы.
-- На следующей неделе устроим праздник!
SELECT DATEADD(week, 1, GETDATE()) AS OneWeekFromNow;
Гибкость — использование переменных вместо строго заданных дат
Используйте переменные или параметры даты для большей гибкости каждого запроса:
DECLARE @Year INT, @WeekNumber INT;
SET @Year = 2023;
SET @WeekNumber = 15;
Различные настройки DATEFIRST и корректная работа SQL-скрипта
Ваш скрипт должен реагировать адекватно на любые значения @@DATEFIRST
. Проверяйте его работоспособность при разных настройках, чтобы быть уверенным в корректном функционировании кода.
Визуализация
Пример: начало и конец 15-ой недели в ISO-системе
SQL Server незамедлительно предоставит начальную и конечную даты для 15-ой недели 2023 года:
-- Собираемся в путешествие на 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;
Путешествие во времени становится проще, когда у каждой недели чётко обозначены границы!
Адаптация скрипта к нестандартным системам нумерации недель и високосным годам
Високосные годы – не причина для беспокойства!
Високосный год добавляет лишний день в календарь, но не стоит переживать. Проверьте работоспособность кода в разные годы и убедитесь в его надёжности, будь то обычный или високосный год!
Разные системы нумерации недель требуют дополнительного внимания
Шаблоны чисел недель могут значительно различаться. Документируйте ваш код и делайте подробные заметки, чтобы обеспечить его понятность и упростить поддержку в будущем.