Переключение нумерации дней недели в SQL: Пн-1, Вс-7

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

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

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

Если хотите обозначить понедельник в SQL как 1, а воскресенье как 7, используйте функцию DATEPART с применением SET DATEFIRST 1. Возьмите DATEPART(dw, YourDate), где YourDate – это дата, которую вы используете.

SQL
Скопировать код
SET DATEFIRST 1; -- Переназначим начало недели на понедельник
SELECT DATEPART(dw, YourDate) AS DayOfWeek; -- Замените YourDate на нужную вам дату

Примечание: действие команды SET DATEFIRST временное и сохраняется до окончания текущей сессии.

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

Вычисление дня недели в особых ситуациях

В случаях, когда невозможно изменить настройки сессии или в уникальных календарных условиях, примените надежную формулу для определения дня недели. Указанная ниже формула не зависит от значения SET DATEFIRST и всегда присваивает понедельнику 1, а воскресенью 7:

SQL
Скопировать код
SELECT ((DATEPART(dw, date) + @@DATEFIRST + 5) % 7 + 1) AS DayOfWeek

Возврат к началу недели по умолчанию

Если хотите вернуть значение DATEFIRST к стандартному расположению, особенно важное в случае общего использования среды или при работе с пулами соединений, выполните SET DATEFIRST 7. Важно помнить, что между понедельником и воскресеньем всего семь дней, не так ли?

SQL
Скопировать код
SET DATEFIRST 7; -- Блуждающие не всегда потерялись. Кое-кто просто в поисках своего воскресенья.

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

Рассмотрим недельное расписание с номерами дней от понедельника до воскресенья, где понедельник обозначен цифрой 1, воскресенье – 7:

Markdown
Скопировать код
| День недели   | В SQL по умолчанию | Желаемое обозначение в SQL |
| ------------- | ------------------ | --------------------------- |
| Понедельник   | 2                  | 1                           |
| Вторник       | 3                  | 2                           |
| Среда         | 4                  | 3                           |
| Четверг       | 5                  | 4                           |
| Пятница       | 6                  | 5                           |
| Суббота       | 7                  | 6                           |
| Воскресенье   | 1                  | 7                           |

Для этого просто переключаемся на другую точку отсчёта недели:

SQL
Скопировать код
SET DATEFIRST 1; -- Меняем режим воскресенья на понедельник
SELECT DATEPART(dw, date) -- И видим результат

Различия в установке первого дня недели

В разных регионах и системах начало недели может быть разным:

  • В странах Ближнего Востока неделя начинается с субботы.
  • Согласно международному стандарту ISO 8601, неделя начинается с понедельника.

Для таких случаев вышеуказанная формула будет действенной и универсальной без использования DATEFIRST.

Выбор языка при отображении дней недели

Если ваше приложение отображает дни недели, используйте функцию DATENAME:

SQL
Скопировать код
-- Отобразите имена дней недели как вам необходимо
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, можно работать быстрее. Предложенная формула всегда гарантирует правильную нумерацию дней недели в различных ситуациях, что делает её гибким и производительным решением.

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

  1. DATEPART (Transact-SQL) – описание функции от Microsoft — официальная документация по DATEPART.
  2. SET DATEFIRST (Transact-SQL) – настройки от Microsoft — информация о том, как настроить первый день недели.
  3. SQL в Википедии: Общие сведения — обзор функций для работы с датой и временем в SQL.
  4. Обсуждение приведения типов даты на Stack Exchange — размышления о воздействии функций приведения типов на скорость запросов.
  5. Установка первого дня недели в SQL — советы на Stack Exchange — рекомендации от сообщества.