Вычисление разницы между двумя datetime в SQL Server
Быстрый ответ
Функция DATEDIFF в SQL Server предоставляет возможность высчитывать разницу между двумя временными отметками. Для этого требуется указать единицу измерения времени (год, квартал, месяц, день, час и т.д.), а также начальную и конечную даты:
-- разница в днях
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 учитывает только полные единицы измерения.
Борьба с "милисекундной" бомбой
Для вычисления разницы с точностью до миллисекунд, установите единицу измерения в millisecond
:
-- Непрерывный отсчет миллисекунд
SELECT DATEDIFF(millisecond, '2023-01-01T08:00', '2023-01-02T17:00') AS MillisecondsDiff;
Для получения разницы в секундах с учетом миллисекунд, поделите результат на 1000:
-- Делим на тысячу для получения секунд
SELECT DATEDIFF(millisecond, '2023-01-01T08:00', '2023-01-02T17:00') / 1000.0 AS SecondsDiff;
Время, прошедшее от заданного дня до настоящего момента
Чтобы определить разницу между конкретной датой и текущим временем, воспользуйтесь функцией GETDATE():
-- Сколько дней прошло от указанной даты до сегодня?
SELECT DATEDIFF(day, '2023-01-01T08:00', GETDATE()) AS DaysFromNow;
Сравнение: DATEDIFF против DATEADD
Для получения точной разницы, корректируйте дату до сравнения с помощью функции DATEADD, а затем используйте DATEDIFF:
-- Разница в часах от начала последнего часа
SELECT DATEDIFF(hour, DATEADD(hour, DATEDIFF(hour, 0, GETDATE()), 0), GETDATE()) AS HoursSinceHourStart;
Улучшение представления данных
Преобразование формата выводимого времени с помощью CONVERT сделает информацию более восприимчивой:
-- Представление времени в удобном формате
SELECT CONVERT(varchar, DATEADD(second, DATEDIFF(second, '2023-01-01T08:00', '2023-01-02T17:00'), 0), 108) AS TimeHHMMSS;
Борьба с часовыми поясами
При вычислении разницы между двумя временными зонами обратитесь к функции AT TIME ZONE:
-- Сравнение времени в разных часовых поясах
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 позволяет получить несколько результатов:
-- Многофункциональный запрос для одной таблицы
SELECT
DATEDIFF(day, StartTime, EndTime) AS DateDiffDays,
DATEDIFF(hour, StartTime, EndTime) AS DateDiffHours,
DATEDIFF(minute, StartTime, EndTime) AS DateDiffMinutes
FROM YourTable;
Визуализация
Пример расчета разницы между двуми временными отметками:
Время отправления поезда А: 🚄 2023-03-01 08:00:00
Время отправления поезда В: 🚅 2023-03-02 14:00:00
Расчеты могут быть произведены следующим образом:
SELECT DATEDIFF(hour, '2023-03-01 08:00:00', '2023-03-02 14:00:00') AS TimeDifference;
Вывод:
Временной промежуток: 🕒 **30 часов**
Переход через границы единиц времени
DATEDIFF учитывает количество раз, когда перешли границу временной единицы, но не учитывает продолжительность периода:
-- Сколько раз мы пересекли границу года?
SELECT DATEDIFF(year, '2023-12-31', '2024-01-01') AS YearBoundaryCrossed;
Високосные секунды: невидимые осложнения
SQL Server не учитывает високосные секунды при расчетах, так что оценивайте точность вычислений с осторожностью.
Глубокое погружение: изучайте дополнительные материалы
Рекомендуем подробнее изучить материалы на Microsoft Learn и MSDN для более глубокого понимания работы с датами и временем в SQL Server.
Полезные материалы
- DATEDIFF (Transact-SQL) – SQL Server | Microsoft Learn — использование функции DATEDIFF.
- CAST and CONVERT (Transact-SQL) – SQL Server | Microsoft Learn — подробно о функциях CAST и CONVERT.
- Date and Time Data Types and Functions – SQL Server (Transact-SQL) | Microsoft Learn — о типах данных и функциях для работы с датами и временем в SQL Server.
- Преобразование timedelta в дни, часы и минуты – Stack Overflow — дискуссия о расчетах временных интервалов.
- Продвинутые расчеты даты и времени в SQL Server — статья о сложных расчетах дат и времени.