DATEDIFF в SQL используют, чтобы посчитать разницу между датами: сколько дней прошло с заказа, сколько месяцев клиент не покупал, сколько лет сотрудник работает в компании. Но важный нюанс в том, что синтаксис DATEDIFF сильно зависит от базы данных
В SQL Server пример выглядит так:
SELECT DATEDIFF(day, '2026-01-01', '2026-01-10') AS days_count;
Результат будет 9, потому что между 1 января и 10 января прошло девять границ дней
DATEDIFF в SQL Server
В SQL Server функция принимает единицу измерения, начальную дату и конечную дату
DATEDIFF(datepart, startdate, enddate)
Пример для заказов:
SELECT
order_id,
created_at,
DATEDIFF(day, created_at, GETDATE()) AS days_from_order
FROM orders;
Так можно понять, сколько дней прошло с момента создания заказа до текущей даты
Единицы измерения могут быть разными: day, month, year, hour, minute. Но нужно помнить, что DATEDIFF считает переходы между границами единиц, а не всегда «полные периоды» в бытовом смысле
DATEDIFF в MySQL
В MySQL DATEDIFF считает разницу в днях и принимает две даты
SELECT DATEDIFF('2026-01-10', '2026-01-01') AS days_count;
Здесь порядок аргументов другой: сначала конечная дата, затем начальная. Поэтому при переносе запроса между SQL Server и MySQL легко получить отрицательное число
Что делать в PostgreSQL и SQLite
В PostgreSQL часто вычитают даты напрямую
SELECT DATE '2026-01-10' - DATE '2026-01-01' AS days_count;
В SQLite используют функции дат и julianday
SELECT julianday('2026-01-10') - julianday('2026-01-01') AS days_count;
Именно поэтому материал по DATEDIFF всегда нужно читать с привязкой к вашей базе
Мини-практика
Создайте таблицу заказов и посчитайте возраст заказа в днях. Пример ниже для SQL Server
CREATE TABLE orders (
order_id INT,
created_at DATE
);
INSERT INTO orders (order_id, created_at) VALUES
(1, '2026-01-01'),
(2, '2026-01-10');
SELECT
order_id,
created_at,
DATEDIFF(day, created_at, '2026-01-20') AS days_from_order
FROM orders;
Первый заказ должен дать 19, второй — 10
Частые ошибки
Первая ошибка — копировать синтаксис SQL Server в MySQL или PostgreSQL. Название функции может совпадать, но порядок аргументов и смысл отличаются
Вторая ошибка — ожидать, что разница в месяцах всегда равна «полным месяцам». В SQL Server DATEDIFF(month, ...) считает пересечение границ месяцев, а не обязательно полные календарные месяцы
Третья ошибка — хранить даты как текст в непонятном формате. Если база не распознает строку как дату, расчет может дать ошибку или странный результат
Что почитать дальше по SQL
Если нужен общий маршрут по теме, откройте рубрику SQL. Для соседних задач пригодятся эти разборы:
- ALTER TABLE в SQL: как добавить, изменить и удалить столбец
- BETWEEN SQL: как выбрать значения в диапазоне
- CREATE TABLE SQL: как создать таблицу запросом
- CSV в SQL: как загрузить файл в базу данных
Как проверить результат на практике
Для SQL-материала всегда начинайте с маленькой тестовой таблицы или с ограниченного набора строк. Сначала выполните SELECT, который показывает будущие данные, затем проверьте условие WHERE, сортировку или соединение, и только после этого переходите к изменяющим командам вроде UPDATE, DELETE или ALTER TABLE. Такой порядок снижает риск случайно изменить больше строк, чем планировалось
Хорошая самопроверка простая: заранее запишите, сколько строк должно попасть в результат, какие столбцы должны измениться и что должно остаться без изменений. Если запрос возвращает неожиданный набор строк, не добавляйте новые условия вслепую, а проверьте каждую часть отдельно: фильтр, соединение, группировку и сортировку



