Вычисление разницы между двумя datetime в SQL Server

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Функция DATEDIFF в SQL Server предоставляет возможность высчитывать разницу между двумя временными отметками. Для этого требуется указать единицу измерения времени (год, квартал, месяц, день, час и т.д.), а также начальную и конечную даты:

SQL
Скопировать код
-- разница в днях
SELECT DATEDIFF(day, '2023-01-01T08:00', '2023-01-02T17:00') AS DaysDiff;

-- или в часах
SELECT DATEDIFF(hour, '2023-01-01T08:00', '2023-01-02T17:00') AS HoursDiff;

Учтите, DATEDIFF учитывает только полные единицы измерения.

Кинга Идем в IT: пошаговый план для смены профессии

Борьба с "милисекундной" бомбой

Для вычисления разницы с точностью до миллисекунд, установите единицу измерения в millisecond:

SQL
Скопировать код
-- Непрерывный отсчет миллисекунд
SELECT DATEDIFF(millisecond, '2023-01-01T08:00', '2023-01-02T17:00') AS MillisecondsDiff;

Для получения разницы в секундах с учетом миллисекунд, поделите результат на 1000:

SQL
Скопировать код
-- Делим на тысячу для получения секунд
SELECT DATEDIFF(millisecond, '2023-01-01T08:00', '2023-01-02T17:00') / 1000.0 AS SecondsDiff;

Время, прошедшее от заданного дня до настоящего момента

Чтобы определить разницу между конкретной датой и текущим временем, воспользуйтесь функцией GETDATE():

SQL
Скопировать код
-- Сколько дней прошло от указанной даты до сегодня?
SELECT DATEDIFF(day, '2023-01-01T08:00', GETDATE()) AS DaysFromNow;

Сравнение: DATEDIFF против DATEADD

Для получения точной разницы, корректируйте дату до сравнения с помощью функции DATEADD, а затем используйте DATEDIFF:

SQL
Скопировать код
-- Разница в часах от начала последнего часа
SELECT DATEDIFF(hour, DATEADD(hour, DATEDIFF(hour, 0, GETDATE()), 0), GETDATE()) AS HoursSinceHourStart;

Улучшение представления данных

Преобразование формата выводимого времени с помощью CONVERT сделает информацию более восприимчивой:

SQL
Скопировать код
-- Представление времени в удобном формате
SELECT CONVERT(varchar, DATEADD(second, DATEDIFF(second, '2023-01-01T08:00', '2023-01-02T17:00'), 0), 108) AS TimeHHMMSS;

Борьба с часовыми поясами

При вычислении разницы между двумя временными зонами обратитесь к функции AT TIME ZONE:

SQL
Скопировать код
-- Сравнение времени в разных часовых поясах
SELECT DATEDIFF(hour, 
    '2023-01-01T08:00' AT TIME ZONE 'Eastern Standard Time', 
    '2023-01-02T17:00' AT TIME ZONE 'Pacific Standard Time') AS HoursDiffTimeZone;

Комбинирование вызовов в SELECT

Одновременное использование различных вызовов DATEDIFF в одном запросе SELECT позволяет получить несколько результатов:

SQL
Скопировать код
-- Многофункциональный запрос для одной таблицы
SELECT 
    DATEDIFF(day, StartTime, EndTime) AS DateDiffDays,
    DATEDIFF(hour, StartTime, EndTime) AS DateDiffHours,
    DATEDIFF(minute, StartTime, EndTime) AS DateDiffMinutes
FROM YourTable;

Визуализация

Пример расчета разницы между двуми временными отметками:

Markdown
Скопировать код
Время отправления поезда А: 🚄 2023-03-01 08:00:00
Время отправления поезда В: 🚅 2023-03-02 14:00:00

Расчеты могут быть произведены следующим образом:

SQL
Скопировать код
SELECT DATEDIFF(hour, '2023-03-01 08:00:00', '2023-03-02 14:00:00') AS TimeDifference;

Вывод:

Markdown
Скопировать код
Временной промежуток: 🕒 **30 часов**

Переход через границы единиц времени

DATEDIFF учитывает количество раз, когда перешли границу временной единицы, но не учитывает продолжительность периода:

SQL
Скопировать код
-- Сколько раз мы пересекли границу года?
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01') AS YearBoundaryCrossed;

Високосные секунды: невидимые осложнения

SQL Server не учитывает високосные секунды при расчетах, так что оценивайте точность вычислений с осторожностью.

Глубокое погружение: изучайте дополнительные материалы

Рекомендуем подробнее изучить материалы на Microsoft Learn и MSDN для более глубокого понимания работы с датами и временем в SQL Server.

Полезные материалы

  1. DATEDIFF (Transact-SQL) – SQL Server | Microsoft Learn — использование функции DATEDIFF.
  2. CAST and CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — подробно о функциях CAST и CONVERT.
  3. Date and Time Data Types and Functions – SQL Server (Transact-SQL) | Microsoft Learn — о типах данных и функциях для работы с датами и временем в SQL Server.
  4. Преобразование timedelta в дни, часы и минуты – Stack Overflow — дискуссия о расчетах временных интервалов.
  5. Продвинутые расчеты даты и времени в SQL Server — статья о сложных расчетах дат и времени.