Функции для работы с датами: NOW(), CURRENT_DATE, DATE_ADD, EXTRACT и др.
📅 Знакомство с датами в SQL: время — ваш лучший друг!
Даты и время в базах данных — это как специи в кулинарии. Без них данные теряют вкус и контекст! Давайте разберём, как профессионально управлять временем в SQL.
-- Самый простой способ получить текущую дату и время
SELECT NOW(); -- Возвращает timestamp в формате 'YYYY-MM-DD HH:MM:SS'
🔍 Базовые функции: получаем текущие дату и время
Работа с датами начинается с понимания трёх ключевых функций:
SELECT CURRENT_DATE; -- Только дата: '2023-11-15'
SELECT CURRENT_TIME; -- Только время: '14:30:22'
SELECT CURRENT_TIMESTAMP; -- Дата + время: '2023-11-15 14:30:22'
Профессиональный лайфхак: В PostgreSQL используйте CURRENT_TIMESTAMP, в MySQL чаще применяют NOW() — результат идентичный!
➕ DATE_ADD и DATE_SUB: магия временных интервалов
Добавляем или вычитаем интервалы — основа для расчёта сроков:
-- Заказы, созданные более 30 дней назад
SELECT * FROM orders
WHERE order_date < DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY);
-- MySQL вариант с DATE_ADD:
SELECT DATE_ADD(NOW(), INTERVAL 1 MONTH) AS next_month;
Важно: В PostgreSQL вместо этого используют оператор +:
-- PostgreSQL эквивалент
SELECT NOW() + INTERVAL '1 month';
✂️ EXTRACT: добываем части даты как золото
Когда нужен только год, месяц или день:
SELECT
EXTRACT(YEAR FROM NOW()) AS current_year,
EXTRACT(MONTH FROM NOW()) AS current_month,
EXTRACT(DAY FROM NOW()) AS day_of_month;
Реальный кейс: Группировка продаж по кварталам:
SELECT
EXTRACT(QUARTER FROM sale_date) AS quarter,
SUM(amount) AS total_sales
FROM sales
GROUP BY quarter;
📊 DATEDIFF: считаем дни между датами
Хотите узнать возраст клиента или срок выполнения заказа?
-- MySQL:
SELECT DATEDIFF('2023-12-31', '2023-01-01') AS days_in_2023;
-- PostgreSQL (другой синтаксис):
SELECT '2023-12-31'::date - '2023-01-01'::date;
Бонус-трек: В SQL Server используйте DATEDIFF(day, start, end).
🎯 DATE_FORMAT (MySQL) и TO_CHAR (PostgreSQL): красивое форматирование
Презентуем даты по-человечески:
-- MySQL:
SELECT DATE_FORMAT(NOW(), '%W, %M %e %Y') AS pretty_date; -- "Wednesday, November 15 2023"
-- PostgreSQL:
SELECT TO_CHAR(NOW(), 'Day, Month DD YYYY') AS pretty_date;
🚀 Продвинутые техники: временные зоны и парсинг
Для тех, кто хочет большего:
-- Работа с временными зонами (PostgreSQL)
SELECT NOW() AT TIME ZONE 'Europe/Moscow' AS moscow_time;
-- Парсинг строк в даты
SELECT STR_TO_DATE('15-11-2023', '%d-%m-%Y') AS parsed_date; -- MySQL
💡 Главный секрет: практикуйтесь с реальными данными!
Лучший способ освоить функции дат — применить их к вашей базе:
- Найдите заказы за последние 7 дней
- Сгруппируйте продажи по месяцам
- Рассчитайте среднее время выполнения заказа
P.S. В разных СУБД синтаксис может отличаться — всегда проверяйте документацию вашей базы данных!