Переключение нумерации дней недели в SQL: Пн-1, Вс-7
Быстрый ответ
Если хотите обозначить понедельник в SQL как 1
, а воскресенье как 7
, используйте функцию DATEPART
с применением SET DATEFIRST 1
. Возьмите DATEPART(dw, YourDate)
, где YourDate
– это дата, которую вы используете.
SET DATEFIRST 1; -- Переназначим начало недели на понедельник
SELECT DATEPART(dw, YourDate) AS DayOfWeek; -- Замените YourDate на нужную вам дату
Примечание: действие команды SET DATEFIRST
временное и сохраняется до окончания текущей сессии.
Вычисление дня недели в особых ситуациях
В случаях, когда невозможно изменить настройки сессии или в уникальных календарных условиях, примените надежную формулу для определения дня недели. Указанная ниже формула не зависит от значения SET DATEFIRST
и всегда присваивает понедельнику 1
, а воскресенью 7
:
SELECT ((DATEPART(dw, date) + @@DATEFIRST + 5) % 7 + 1) AS DayOfWeek
Возврат к началу недели по умолчанию
Если хотите вернуть значение DATEFIRST
к стандартному расположению, особенно важное в случае общего использования среды или при работе с пулами соединений, выполните SET DATEFIRST 7
. Важно помнить, что между понедельником и воскресеньем всего семь дней, не так ли?
SET DATEFIRST 7; -- Блуждающие не всегда потерялись. Кое-кто просто в поисках своего воскресенья.
Визуализация
Рассмотрим недельное расписание с номерами дней от понедельника до воскресенья, где понедельник обозначен цифрой 1
, воскресенье – 7
:
| День недели | В SQL по умолчанию | Желаемое обозначение в SQL |
| ------------- | ------------------ | --------------------------- |
| Понедельник | 2 | 1 |
| Вторник | 3 | 2 |
| Среда | 4 | 3 |
| Четверг | 5 | 4 |
| Пятница | 6 | 5 |
| Суббота | 7 | 6 |
| Воскресенье | 1 | 7 |
Для этого просто переключаемся на другую точку отсчёта недели:
SET DATEFIRST 1; -- Меняем режим воскресенья на понедельник
SELECT DATEPART(dw, date) -- И видим результат
Различия в установке первого дня недели
В разных регионах и системах начало недели может быть разным:
- В странах Ближнего Востока неделя начинается с субботы.
- Согласно международному стандарту ISO 8601, неделя начинается с понедельника.
Для таких случаев вышеуказанная формула будет действенной и универсальной без использования DATEFIRST
.
Выбор языка при отображении дней недели
Если ваше приложение отображает дни недели, используйте функцию DATENAME
:
-- Отобразите имена дней недели как вам необходимо
SELECT CASE DATENAME(weekday, date)
WHEN 'Monday' THEN 1
WHEN 'Tuesday' THEN 2
WHEN 'Wednesday' THEN 3
WHEN 'Thursday' THEN 4
WHEN 'Friday' THEN 5
WHEN 'Saturday' THEN 6
WHEN 'Sunday' THEN 7
END AS DayOfWeek
Не забудьте, что настройки языка в SQL Server влияют на отображаемые результаты функции DATENAME()
.
Как работать быстрее
Главное – найти баланс между точностью и производительностью. Если избегать использования CASE
и воспользоваться SET DATEFIRST
, можно работать быстрее. Предложенная формула всегда гарантирует правильную нумерацию дней недели в различных ситуациях, что делает её гибким и производительным решением.
Полезные материалы
- DATEPART (Transact-SQL) – описание функции от Microsoft — официальная документация по
DATEPART
. - SET DATEFIRST (Transact-SQL) – настройки от Microsoft — информация о том, как настроить первый день недели.
- SQL в Википедии: Общие сведения — обзор функций для работы с датой и временем в SQL.
- Обсуждение приведения типов даты на Stack Exchange — размышления о воздействии функций приведения типов на скорость запросов.
- Установка первого дня недели в SQL — советы на Stack Exchange — рекомендации от сообщества.