Выборка записей за последние N дней в MySQL с помощью CURDATE и INTERVAL

Устали считать даты на калькуляторе? MySQL CURDATE и INTERVAL сделают выборку за неделю, месяц или любой диапазон элементарно просто. Примеры внутри!

В работе с базами данных часто требуется отбирать строки, относящиеся к определённому диапазону дат – например, за последние 7 дней, за текущий месяц или за произвольный период, указанный пользователем․ В MySQL для этого удобно использовать функцию CURDATE, которая возвращает текущую дату без времени (формат YYYY‑MM‑DD)․

Содержание

  1. Что делает CURDATE
  2. Отбор за последние N дней с помощью INTERVAL
  3. Отбор с использованием DATEDIFF
  4. Отбор через оператор BETWEEN
  5. Динамический ввод N дней от пользователя
  6. Учёт часового пояса
  7. Краткое резюме

Что делает 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