DATEDIFF SQL: как посчитать разницу между датами

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. Для соседних задач пригодятся эти разборы:

Как проверить результат на практике

Для SQL-материала всегда начинайте с маленькой тестовой таблицы или с ограниченного набора строк. Сначала выполните SELECT, который показывает будущие данные, затем проверьте условие WHERE, сортировку или соединение, и только после этого переходите к изменяющим командам вроде UPDATE, DELETE или ALTER TABLE. Такой порядок снижает риск случайно изменить больше строк, чем планировалось

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

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x