Определение дня недели по дате в SQL Server 2005/2008
Быстрый ответ
Для определения дня недели в SQL Server применяйте функцию DATEPART с аргументами dw или weekday. Если вам требуется сделать первым днём недели иной от стандартного, откорректируйте значение SET DATEFIRST в соответствии с вашими требованиями. Вот пример, когда неделя начинается с понедельника:
SET DATEFIRST 1; -- Понедельник становится первым днём недели
SELECT DATEPART(dw, GETDATE()) AS DayOfWeek;
Данный запрос вернёт 1 для понедельника, и далее значение будет поочерёдно увеличиваться до 7 для воскресенья, независимо от стандартных настроек сервера.

Всё зависит от параметра DATEFIRST
@@DATEFIRST в SQL Server показывает первый день недели, что может меняться в зависимости от пользовательских предпочтений или особых требований. Определить, какой день начинает неделю в вашей базе данных, можно при помощи запроса SELECT @@DATEFIRST AS StartOfWeek.
Запрос DATEPART(dw, GETDATE()) вернёт числовое значение текущего дня недели, при этом это значение будет зависеть от установленного DATEFIRST.
Таким образом, для гарантированно одинаковых результатов, всегда учитывайте параметр DATEFIRST при использовании DATEPART().
Начинаем неделю на свой манер
Если неделя для вас начинается не с воскресенья, а, например, с понедельника, как это установлено в международном стандарте ISO 8601, используйте следующий код:
SET DATEFIRST 1; -- Первый день недели теперь понедельник
SELECT DATENAME(dw, GETDATE()) AS DayName, DATEPART(dw, GETDATE()) AS DayNumber;
Здесь DayName будет содержать название дня недели, а DayNumber — его числовой эквивалент.
Гибкость с DATEFIRST
Помните: если вы изменили DATEFIRST, то результаты могут отличаться от привычных. Вы всегда можете восстановить значение после выполнения запроса или принять во внимание изменения при анализе результатов:
-- Восстановим изначальное значение
SET DATEFIRST 7;
Использование CASE позволяет связать числовые значения DATEPART с соответствующими днями недели:
SELECT
CASE DATEPART(dw, GETDATE())
WHEN 1 THEN 'Воскресенье'
WHEN 2 THEN 'Понедельник'
-- Добавьте условия для остальных дней
END AS DayOfWeek;
Визуализация
Вам можно представить стены календаря с подсвеченными днями:
🗓️: [Вс, Пн, Вт, Ср, Чт, Пт, Сб]
Определение текущего дня недели аналогично подсветке нужного дня на календаре:
SELECT DATEPART(dw, GETDATE());
Это, как если бы вы освещали календарь фонариком, подсвечивая сегодняшний день:
🗓️: [Вс, **Пн**, Вт, Ср, Чт, Пт, Сб]
🔦: Освещаем '**Пн**' — сегодня понедельник, и свет это демонстрирует!
Таким образом, SQL Server помогает выявить день недели — в данном случае понедельник на вашем календаре.
Всегда храните дату в типе данных datetime, чтобы обеспечить корректное взаимодействие функций с вашими данными.
Когда работаете с днями недели, всегда учитывайте граничные случаи и возможность применения арифметических операций со строгим остатком (% 7), не забывая при этом о параметре DATEFIRST, особенно когда дело доходит до расчёта отступов дней в контексте дней недели.
Обратите внимание на установку DATEFIRST перед началом работы с датами и днями недели в различных средах.
Полезные материалы
- DATEPART (Transact-SQL) – SQL Server | Microsoft Learn — официальная документация на функцию DATEPART в SQL Server.
- SQL Server: Функция DATEPART — примеры и толкование функции DATEPART.
- Преобразование дат и времени с помощью SQL Server — руководство по различным способам форматирования дат и времени.
- Как разбить ваш код jQuery на функции, делаете ли вы это так же, как в JavaScript? – Stack Overflow — обсуждения в сообществе, включая тему использования DATEPART.