DAY: примеры (SQL)

Получение дня месяца в MS SQL с помощью функции DAY
Раздел: Даты и времени функции, Дата и время
DAY(date): int

Функция DAY в MS SQL Server

Функция DAY в Microsoft SQL Server предназначена для извлечения порядкового номера дня месяца из указанной даты. Она является частью набора скалярных функций для работы с датой и временем, которые упрощают анализ и манипуляцию данными временного типа.

Когда используется: Функция применяется, когда требуется получить числовое значение дня (от 1 до 31) из столбца или переменной типа date, datetime, datetime2, smalldatetime, datetimeoffset или из символьной строки, которую можно неявно преобразовать в дату. Это полезно для группировки данных по дню, фильтрации записей за конкретный день месяца или вычислений, основанных на дне.

Аргументы: Функция принимает ровно один обязательный аргумент:
date — выражение, которое можно привести к одному из типов данных даты/времени. Это может быть имя столбца, переменная, строковый литерал или результат другой функции.

Возвращаемое значение: Функция возвращает целое число типа int в диапазоне от 1 до 31, соответствующее номеру дня в месяце для заданной даты. Для даты 29 февраля функция вернет значение 29.

Примеры использования функции DAY

Пример 1: Использование с переменной.

DECLARE @MyDate datetime = '2023-11-22 14:30:00';
SELECT DAY(@MyDate) AS DayNumber;
DayNumber
-----------
22

Пример 2: Использование со столбцом таблицы.

SELECT OrderID, OrderDate, DAY(OrderDate) AS OrderDay
FROM Orders
WHERE YEAR(OrderDate) = 2023;

Пример 3: Использование с строковым литералом.

SELECT DAY('2024-02-29') AS LeapYearDay;
LeapYearDay
------------
29

Пример 4: Комбинирование с другими функциями даты.

SELECT GETDATE() AS CurrentDateTime,
       DAY(GETDATE()) AS CurrentDay,
       MONTH(GETDATE()) AS CurrentMonth,
       YEAR(GETDATE()) AS CurrentYear;

Похожие функции в MS SQL

Для работы с компонентами даты в SQL Server существуют и другие функции:

  • MONTH(date) — возвращает номер месяца (1–12) из указанной даты.
  • YEAR(date) — возвращает год в виде четырехзначного числа.
  • DATEPART(datepart, date) — универсальная функция для извлечения любой части даты (дня, месяца, года, недели, квартала и т.д.). Для получения дня используется DATEPART(day, date) или DATEPART(dd, date).
  • DATENAME(datepart, date) — возвращает имя компонента даты (например, название дня недели или месяца) в виде строки.

Выбор функции: Функция DAY предпочтительнее, когда требуется именно целочисленный номер дня месяца, из-за своей простоты и читаемости. DATEPART используют, когда часть даты для извлечения определяется динамически, или когда нужен компонент, для которого нет отдельной функции (например, день недели или квартал). DATENAME применяют для получения текстового представления.

Типичные ошибки

Ошибка 1: Передача значения, которое не может быть преобразовано в дату. Это приводит к ошибке преобразования типа.

SELECT DAY('Не дата');
Сообщение 241, уровень 16, состояние 1.
Преобразование типа данных varchar в datetime привело к выходу значения за пределы диапазона.

Ошибка 2: Использование с типом time. Тип time не содержит компонента дня, поэтому вызовет ошибку.

SELECT DAY(CAST('14:30:00' AS time));
Сообщение 9810, уровень 16, состояние 1.
Функция datepart вызвана с аргументом data типа time, недопустимым в данном контексте.

Ошибка 3: Ожидание, что функция вернет день недели. Функция DAY возвращает день месяца. Для дня недели используется DATEPART(weekday, date) или DATENAME(dw, date).

История изменений

Функция DAY существует с ранних версий SQL Server и сохраняет свою базовую семантику. В SQL Server 2008 с введением новых типов данных (date, datetime2, datetimeoffset) функция стала поддерживать и эти типы, что не потребовало изменения синтаксиса. Специфических изменений в поведении или аргументах в последних версиях (2016, 2017, 2019, 2022) не было.

Расширенные примеры

Пример 1: Группировка и агрегация по дню месяца. Подсчет количества заказов, сгруппированных по дню месяца за определенный период.

Пример sql
SELECT DAY(OrderDate) AS DayOfMonth,
       COUNT(OrderID) AS OrdersCount
FROM Orders
WHERE OrderDate >= '2023-11-01' AND OrderDate < '2023-12-01'
GROUP BY DAY(OrderDate)
ORDER BY DayOfMonth;

Пример 2: Фильтрация записей за последний день любого месяца. Используется совместно с EOMONTH.

Пример sql
SELECT *
FROM Events
WHERE EventDate = EOMONTH(EventDate) -- Дата является последним днем своего месяца
   OR DAY(EventDate) = 31; -- Альтернативный, но менее точный вариант (не все месяцы имеют 31 день)

Пример 3: Динамическое формирование даты из частей. Создание даты, где день берется из одной колонки, а месяц и год фиксированы.

Пример sql
SELECT DATEFROMPARTS(2023, 12, DAY(SomeDateColumn)) AS NewDate
FROM SourceTable;

Пример 4: Вычисление интервалов, основанных на дне месяца. Найти все события, которые произошли в первые 10 дней любого месяца.

Пример sql
SELECT *
FROM LogTable
WHERE DAY(LogDate) BETWEEN 1 AND 10;

Пример 5: Использование в выражении CASE для классификации. Разделение дней месяца на декады.

Пример sql
SELECT OrderDate,
       CASE
           WHEN DAY(OrderDate) BETWEEN 1 AND 10 THEN 'Первая декада'
           WHEN DAY(OrderDate) BETWEEN 11 AND 20 THEN 'Вторая декада'
           ELSE 'Третья декада'
       END AS MonthDecade
FROM Orders;

Пример 6: Работа с датами, хранящимися как строка. Важно обеспечить корректный формат строки для неявного преобразования.

Пример sql
SELECT DAY('20231122') AS DayFromString; -- Формат 'YYYYMMDD' распознается однозначно
DayFromString
--------------
22

Аналоги функции в других СУБД

MySQL: Функция DAY() или DAYOFMONTH() работают идентично MS SQL.

SELECT DAY('2023-12-01'), DAYOFMONTH('2023-12-01');
1, 1

Oracle: Используется функция EXTRACT(DAY FROM date).

SELECT EXTRACT(DAY FROM DATE '2023-11-22') FROM dual;
22

PostgreSQL: Аналогично Oracle — EXTRACT(DAY FROM date) или можно использовать DATE_PART('day', date), которая возвращает тип double precision.

SELECT EXTRACT(DAY FROM TIMESTAMP '2023-11-22');
22

SQLite: Специальной функции нет. Используют функцию strftime('%d', date_string), которая возвращает день как строку (с ведущим нулем). Для получения числа используют CAST.

SELECT CAST(strftime('%d', '2023-11-05') AS INTEGER);
5

Sybase ASE: Поддерживает функцию DAY(date), аналогичную MS SQL.

MS SQL DAY function comments

En
DAY Returns the day part of a date