Преобразование номера месяца в название в SQL без CASE
Быстрый ответ
Для конвертации номера месяца в название на языке SQL воспользуйтесь функциями DATENAME
и DATEFROMPARTS
в SQL Server:
-- SQL Server
SELECT DATENAME(month, DATEFROMPARTS(2023, @MonthNumber, 1)) AS MonthName;
В MySQL и Oracle для этого предназначены функции MONTHNAME
и TO_CHAR
:
-- MySQL
SELECT MONTHNAME(STR_TO_DATE(@MonthNumber, '%m')) AS MonthName;
-- Oracle
SELECT TO_CHAR(TO_DATE(@MonthNumber, 'MM'), 'Month') AS MonthName;
Необходимо заменить значение @MonthNumber
на соответствующий номер месяца. Код может быть модифицирован в зависимости от используемой СУБД.
Обработка нешаблонных ситуаций
Возможность получить название месяца без указания даты может потребоваться изредка – здесь пригодится небольшой трюк: создадим фиксированную базовую дату.
-- SQL Server
SELECT DATENAME(month, DATEADD(month, @MonthNumber – 1, '19000101')) AS MonthName;
Чтобы взять сокращённые имена месяцев, например «Янв», «Фев», можно получить подстроку:
-- SQL Server
SELECT SUBSTRING(CONVERT(varchar, DATEADD(month, @MonthNumber – 1, '19000101'), 107), 1, 3) AS ShortMonthName;
Если у нас фискальный год начинается, скажем, в апреле, код на SQL будет следующим:
-- SQL Server
SELECT DATENAME(month, DATEADD(month, (@MonthNumber + 3) % 12, '19000101')) AS FiscalMonthName;
Все эти примеры демонстрируют, насколько универсальны могут быть функции SQL при работе с датами.
Визуализация
Месяцы — словно участники маскарада, их истинные имена раскрывает SQL:
| Маска (Номер) | Настоящее имя |
| ---------------------------- | ------------------------- |
| 1 | 🎭 Январь |
| 2 | 🎭 Февраль |
| 3 | 🎭 Март |
| 4 | 🎭 Апрель |
| 5 | 🎭 Май |
| 6 | 🎭 Июнь |
| 7 | 🎭 Июль |
| 8 | 🎭 Август |
| 9 | 🎭 Сентябрь |
| 10 | 🎭 Октябрь |
| 11 | 🎭 Ноябрь |
| 12 | 🎭 Декабрь |
Повышение уровня
SQL на разных языках
Функции, чья работа зависит от языка, такие как DATENAME
, учитывают текущую языковую настройку:
-- SQL Server
SET LANGUAGE French;
SELECT DATENAME(month, @YourDate) AS MonthName;
SQL искусства
Увеличьте многогранность запросов, используя динамический SQL:
-- SQL Server
DECLARE @sql NVARCHAR(MAX) = N'SELECT DATENAME(month, ''1900-'' + CAST(@MonthNumber AS VARCHAR) + ''-01'') AS MonthName';
EXEC sp_executesql @sql, N'@MonthNumber INT', @MonthNumber = 5;
Различия и многобразие форматов дат
Учитывайте локализацию, используйте форматы дат, специфичные для вашего региона:
-- SQL Server
SELECT FORMAT(DATEFROMPARTS(2023, @MonthNumber, 1), 'MMMM', 'ja-JP') AS JapaneseMonthName;
Отслеживание ошибок
Проверяйте вводимые значения, чтобы избежать ошибок:
-- SQL Server
IF @MonthNumber BETWEEN 1 AND 12
SELECT DATENAME(month, DATEFROMPARTS(2023, @MonthNumber, 1)) AS MonthName;
ELSE
RAISERROR('Некорректный номер месяца...', 16, 1);
SQL комфортно и безопасно работает с данными, будучи в тоже время и надёжным исследователем, и неприступным охранником.
Полезные материалы
- Функция SQL Server DATEPART() — использование DATEPART для конвертации номера месяца в название месяца в SQL Server.
- PostgreSQL: Функции и операторы работы с датой/временем — руководство по функциям обработки дат и времени в PostgreSQL.
- Руководство по MySQL 8.0: Функции даты и времени — функция MONTHNAME в MySQL для получения названия месяца.
- TO_CHAR (datetime) — преобразование даты в название месяца в Oracle.
- Функции даты и времени – SQLite — функция strftime() в SQLite для работы с датой и временем.
- Типы данных и функции даты и времени – SQL Server (Transact-SQL) — типы данных и функции для работы с датой и временем в SQL Server.