SQL работа с датами: полезные функции и примеры использования

Время и дата - важнейшие характеристики во многих системах и приложениях. SQL предоставляет развитый инструментарий для работы с датой-временем - специальные типы данных и множество функций. Давайте разберемся!

Типы данных даты и времени в SQL

SQL поддерживает несколько типов данных для хранения даты и времени:

  • DATE - только дата
  • TIME - только время
  • DATETIME - дата и время
  • TIMESTAMP - дата и время
  • YEAR - только год

Давайте подробнее разберем особенности каждого.

DATE

Хранит только дату в формате ГГГГ-ММ-ДД от 1000-01-01 до 9999-12-31.

Занимает 3 байта. Подходит, если время не важно.

TIME

Хранит время в формате ЧЧ:ММ:СС от '-838:59:59' до '838:59:59'.

Занимает 3 байта. Используется со значениями меньше 24 часов.

DATETIME

Хранит дату и время от '1000-01-01 00:00:00' до '9999-12-31 23:59:59', точность - 1 секунда.

Занимает 8 байт. Самый распространенный тип данных даты-времени в SQL.

TIMESTAMP

Тот же диапазон значений, что и у DATETIME. Отличается тем, что при вставке и обновлении автоматически подставляется текущая дата-время.

YEAR

Хранит только год от 1901 до 2155. Занимает 1 байт.

Мало используется на практике из-за ограниченности.

Как видно из обзора, наиболее универсальный тип данных для хранения даты-времени в SQL - это DATETIME. А для хранения только даты подходит DATE.

Основные функции даты-времени в SQL

SQL предоставляет множество встроенных функций для работы с датой-временем, позволяющие выполнять разные операции и преобразования.

Рассмотрим самые полезные:

Текущая дата-время

  • NOW() - текущая дата и время
  • CURDATE() - текущая дата
  • CURTIME() - текущее время

Эти функции часто используются для подстановки актуального значения даты-времени в момент вставки или обновления записи:

INSERT INTO events (date) VALUES (NOW());

Выборка части даты

Функции для извлечения отдельных компонент даты-времени:

  • YEAR(date) - год
  • MONTH(date) - месяц
  • DAY(date) - день
  • HOUR(datetime) - часы
  • MINUTE(datetime) - минуты
  • SECOND(datetime) - секунды

Пример получения месяца из даты:

SELECT MONTH('2023-11-29') -> 11

Прибавление и вычитание интервалов

Чтобы прибавить к дате интервал используется функция DATE_ADD:

DATE_ADD(date, INTERVAL value type)

Где value - количество, а type - тип интервала (DAY, WEEK, MONTH, YEAR и др.)

Например, прибавить 5 дней:

DATE_ADD('2023-11-29', INTERVAL 5 DAY) -> 2023-12-04

Аналогично для вычитания интервалов используется DATE_SUB.

Разница между датами

Чтобы найти разницу между двумя датами в определенных единицах измерения, используется функция DATEDIFF:

DATEDIFF(unit, date1, date2)

Например, разница в днях:

DATEDIFF(DAY, '2023-11-25', '2023-11-29') -> 4

Единицы измерения могут быть DAY, WEEK, MONTH, YEAR и другими.

Форматирование даты

Функция DATE_FORMAT позволяет отформатировать дату-время в нужном виде с помощью специальныхспецификаторов:

DATE_FORMAT(date, 'format')

Например, вывести в формате "05 декабря 2023 г.":

DATE_FORMAT('2023-12-05', '%d %M %Y г.') 

Подробнее форматы даты-времени мы разберем в следующем разделе.

Форматы даты и времени в SQL

Дата и время в SQL могут выводиться в разных форматах. Формат задается с помощью специальных спецификаторов.

Спецификаторы для формата даты

  • %d - день месяца (01 - 31)
  • %m - номер месяца (01 - 12)
  • %M - полное название месяца
  • %Y - год в формате YYYY
  • %y - год в формате YY
  • %D - день недели в текстовом виде
  • %d%m%Y - дд.мм.гггг (05.12.2023)

Спецификаторы для формата времени

  • %H - часы (00-23)
  • %h - часы (01-12)
  • %i - минуты (00-59)
  • %s - секунды (00-59)
  • %H:%i:%s - ЧЧ:ММ:СС

С помощью этих спецификаторов можно сформировать дату и время в любом нужном виде.

Пользовательские форматы

Если требуется нестандартный формат даты-времени, можно создать свой с помощью конкатенации спецификаторов и других символов:

DATE_FORMAT(date, 'Формат: %d/%m/%Y')

Это позволяет получить полностью пользовательское форматирование.

Использование даты-времени в запросах

Рассмотрим основные варианты использования даты-времени в SQL запросах.

Выборка данных за период

Чтобы получить данные за конкретный период, используется оператор BETWEEN:

SELECT * FROM events 
WHERE date BETWEEN '2023-12-01' AND '2023-12-31'

Это позволяет выбрать данные за декабрь 2023 года.

Вычисления с датами

Даты можно использовать в арифметических операциях:

SELECT DATE_ADD(date, INTERVAL 10 DAY) AS next_date, DATEDIFF(date2, date1) AS days_diff FROM events

Здесь мы прибавляем 10 дней и вычисляем разницу в днях между датами.

Сортировка по дате

SELECT * FROM events ORDER BY date DESC

Запрос отсортирует события по убыванию дат.

Группировка и агрегация по дате

Дату можно использовать для группировки данных в запросе:

SELECT DATE(date) AS date, COUNT(*) FROM events GROUP BY DATE(date)

Это позволит посчитать сколько событий было в каждую дату.

Фильтрация по дате

Условия фильтрации в WHERE позволяют отбирать данные по дате:

SELECT * FROM events WHERE MONTH(date) = 12

В результат попадут события только за декабрь.

Вычисление разницы между датами-временем

Рассмотрим подробнее функции для нахождения разницы между двумя значениями даты-времени.

DATEDIFF(unit, date1, date2)

Возвращает разницу в указанной единице измерения (день, месяц, год и т.д.):

DATEDIFF(MONTH, '2023-05-29', '2023-11-29') -> 6

TIMEDIFF(time1, time2)

Вычисляет разницу между временем time1 и time2 в часах, минутах и секундах:

TIMEDIFF('12:00:00', '13:55:00') -> '01:55:00'

Преобразование даты-времени

Также SQL предоставляет функции для преобразования:

  • К нужному типу данных (CAST, CONVERT)
  • К строковому представлению (DATE_FORMAT)
  • Из строкового представления (STR_TO_DATE)

Это позволяет гибко конвертировать значения даты-времени между форматами и типами данных.

Приведение к другому типу данных

Для преобразования даты-времени к другому типу используются функции CAST и CONVERT:

SELECT CAST(NOW() AS DATE); SELECT CONVERT(datetime, '2023-12-05');

Это позволяет, например, конвертировать строку в тип DATETIME или наоборот.

Преобразование к строковому представлению

Чтобы получить строковое представление даты-времени, используется знакомая функция DATE_FORMAT:

SELECT DATE_FORMAT(NOW(), '%d.%m.%Y %H:%i') -> 05.12.2023 14:55

Формат задается с помощью спецификаторов.

Преобразование из строки в дату

Для конвертации строки в дату-время служит функция STR_TO_DATE():

SELECT STR_TO_DATE('05.12.2023 14:55', '%d.%m.%Y %H:%i');

Как видно из примеров, преобразования позволяют гибко оперировать значениями даты-времени в SQL.

Применение на практике

Рассмотрим несколько примеров использования функций даты-времени в реальных задачах.

Анализ истории и активности

С помощью дат можно анализировать историю действий пользователя, например:

SELECT YEAR(registration_date) AS reg_year, AVG(DATEDIFF(NOW(), login_time)) AS avg_inactive_days FROM users GROUP BY reg_year

Это позволит посчитать среднее время неактивности пользователей по годам регистрации.

Комментарии