В работе с базами данных часто требуется отбирать строки, относящиеся к определённому диапазону дат – например, за последние 7 дней, за текущий месяц или за произвольный период, указанный пользователем․ В MySQL для этого удобно использовать функцию CURDATE, которая возвращает текущую дату без времени (формат YYYY‑MM‑DD)․
Содержание
- Что делает
CURDATE - Отбор за последние N дней с помощью
INTERVAL - Отбор с использованием
DATEDIFF - Отбор через оператор
BETWEEN - Динамический ввод N дней от пользователя
- Учёт часового пояса
- Краткое резюме
Что делает CURDATE?
Функция CURDATE возвращает текущую дату сервера MySQL в виде значения типа DATE․ Пример:
SELECT CURDATE; -- 2026-08-06 (если сегодня 6 августа 2026 года) Если требуется получить дату и время, следует использовать NOW․ Но для большинства задач, связанных с «дневными» диапазонами, достаточно именно даты без времени․
Отбор за последние N дней с помощью INTERVAL
Самый простой и читаемый способ – воспользоваться оператором INTERVAL․ Предположим, у вас есть таблица orders с полем order_date типа DATE (или DATETIME, где время будет игнорироваться)․
Пример 1․ Выборка за последние 7 дней
SELECT *
FROM orders
WHERE order_date >= CURDATE ⏤ INTERVAL 7 DAY;
Здесь CURDATE ⏤ INTERVAL 7 DAY вычисляет дату, которая была ровно семь дней назад, а условие >= включает все записи, начиная с этой даты (включительно)․
Пример 2․ Выборка за последние N дней (N задаётся переменной)
SET @days = 30; -- количество дней, которое нужно отобрать
SELECT *
FROM orders
WHERE order_date >= CURDATE ⏤ INTERVAL @days DAY;
Переменная @days может быть заменена параметром, передаваемым из приложения․
Отбор с использованием DATEDIFF
Функция DATEDIFF(date1, date2) возвращает разницу в днях между двумя датами (первый параметр минус второй)․ Её удобно применять, когда нужно сравнить разницу с конкретным числом․
Пример 3․ Записи, сделанные ровно N дней назад
SELECT *
FROM orders
WHERE DATEDIFF(CURDATE, order_date) = 10; -- ровно 10 дней назад
Пример 4․ Записи за последние N дней (включая сегодня)
SELECT *
FROM orders
WHERE DATEDIFF(CURDATE, order_date) BETWEEN 0 AND 14; -- последние 14 дней
Обратите внимание, что DATEDIFF игнорирует время, поэтому даже если order_date хранит DATETIME, сравнение будет корректным․
Отбор через оператор BETWEEN
Если нужен точный диапазон от начала периода до конца, удобно использовать BETWEEN … AND …․ При этом часто комбинируют CURDATE с INTERVAL․
Пример 5․ За последние 30 дней (включительно)
SELECT *
FROM orders
WHERE order_date BETWEEN CURDATE ⏤ INTERVAL 30 DAY AND CURDATE;
Для диапазонов, начинающихся с начала месяца, недели и т․д․, можно использовать функции LAST_DAY, DATE_SUB и WEEK․
Динамический ввод N дней от пользователя
В реальном приложении количество дней часто задаётся в пользовательском интерфейсе․ Ниже пример, как это выглядит в подготовленном запросе (prepared statement) на стороне PHP:
$stmt = $pdo->prepare("
SELECT *
FROM orders
WHERE order_date >= CURDATE ‒ INTERVAL ? DAY
");
$days = $_GET['days']; // например, 15
$stmt->execute([$days]);
$rows = $stmt->fetchAll;
Такой подход защищает от SQL‑инъекций и позволяет менять диапазон без изменения кода․
Учёт часового пояса
Функция CURDATE использует часовой пояс, установленный в MySQL‑сервере (@@global․time_zone и @@session․time_zone)․ Если ваш сервер находится в другом часовом поясе, чем пользователи, рекомендуется явно задавать нужный пояс:
SET time_zone = '+03:00'; -- Московское время
SELECT *
FROM orders
WHERE order_date >= CURDATE ⏤ INTERVAL 7 DAY;
Или использовать функцию CONVERT_TZ при работе с DATETIME:
SELECT *
FROM orders
WHERE CONVERT_TZ(order_date, '+00:00', '+03:00') >= CURDATE ⏤ INTERVAL 7 DAY;
Краткое резюме
CURDATE– возвращает текущую дату без времени․- Для выборки за последние N дней чаще всего используют
INTERVAL:WHERE date_column >= CURDATE ‒ INTERVAL N DAY - Функция
DATEDIFFпозволяет сравнивать разницу в днях:WHERE DATEDIFF(CURDATE, date_column) BETWEEN 0 AND N - Оператор
BETWEEN … AND …удобен для точного диапазона:WHERE date_column BETWEEN CURDATE ‒ INTERVAL N DAY AND CURDATE - Для динамического ввода N используйте параметризованные запросы․
- Не забывайте про часовой пояс сервера – при необходимости задавайте его явно․
Эти приёмы покрывают большинство сценариев, когда нужно отобрать записи за последние N дней в MySQL․ При правильном использовании они делают код читаемым, быстрым и надёжным․
Текущая дата (по времени сервера): 2026‑08‑06