Разница двух дат времени в SQL Server - PullRequest
67 голосов
/ 22 января 2010

Есть ли способ определить разницу между двумя datetime на сервере sql?

Например, мои даты

  1. 2010-01-22 15:29:55.090
  2. 2010-01-22 15:30:09.153

Итак, результат должен быть 14.063 seconds.

Ответы [ 19 ]

83 голосов
/ 22 января 2010

Просто предостережение о DateDiff, оно подсчитывает, сколько раз вы проходите границу, указанную в качестве ваших единиц, и поэтому создает проблемы, если вы ищете точный промежуток времени. например,

select datediff (m, '20100131', '20100201')

дает ответ 1, потому что он пересек границу с января по февраль, поэтому даже если интервал равен 2 дням, datediff вернет значение 1 - он пересек границу 1 даты.

select datediff(mi, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

Дает значение 1, опять же, оно прошло минутную границу один раз, поэтому, даже если оно составляет около 14 секунд, оно будет возвращено как одна минута при использовании минут в качестве единиц измерения.

24 голосов
/ 22 января 2010
SELECT DATEDIFF (MyUnits, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

Заменить "MyUnits" на основе DATEDIFF на MSDN

13 голосов
/ 22 января 2010
SELECT  DATEDIFF(day, '2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')

Замените day другими единицами, в которых вы хотите получить разницу, например second, minute и т. Д.

10 голосов
/ 24 июля 2014

Я могу упомянуть четыре важные функции MS SQL Server, которые могут быть очень полезны:

1) Функция DATEDIFF () отвечает за вычисление различий между двумя датами, результатом может быть « год четверть месяца день день год день неделя минута секунда микросекунда микросекунда наносекунда » указано в первом параметре ( datepart ):

select datediff(day,'1997-10-07','2011-09-11')

2) Вы можете использовать функцию GETDATE () , чтобы получить фактическое время и рассчитать разницу какой-либо даты и фактической даты:

select datediff(day,'1997-10-07', getdate() )

3) Еще одна важная функция - DATEADD () , используемая для преобразования некоторого значения в datetime с использованием той же datepart даты, которую вы можете добавить (с положительными значениями) или вычитать (с отрицательными значениями) одну базовую дату:

select DATEADD(day,  45, getdate()) -- actual datetime adding 45 days
select DATEADD(  s,-638, getdate()) -- actual datetime subtracting 10 minutes and 38 seconds

4) Функция CONVERT () была создана для форматирования даты так, как вам нужно, это не параметрическая функция, но вы можете использовать часть результата для форматирования результата так, как вам нужно:

select convert(  char(8), getdate() ,   8) -- part hh:mm:ss of actual datetime
select convert(  varchar, getdate() , 112) -- yyyymmdd
select convert( char(10), getdate() ,  20) -- yyyy-mm-dd limited by 10 characters

DATETIME рассчитывается в секундах, и один интересный результат, смешивающий эти четыре функции, заключается в показе форматированной разницы между часами, минутами и секундами ( чч: мм: сс ) между двумя датами:

declare  @date1 datetime, @date2 datetime
set @date1=DATEADD(s,-638,getdate())
set @date2=GETDATE()

select convert(char(8),dateadd(s,datediff(s,@date1,@date2),'1900-1-1'),8)

... результат 00: 10: 38 (638 с = 600 с + 38 с = 10 минут и 38 секунд)

Другой пример:

select distinct convert(char(8),dateadd(s,datediff(s, CRDATE , GETDATE() ),'1900-1-1'),8) from sysobjects order by 1
5 голосов
/ 09 апреля 2014

Существует несколько способов взглянуть на разницу в дате и многое другое при сравнении даты / времени. Вот что я использую, чтобы получить разницу между двумя датами в формате «ЧЧ: ММ: СС»:

ElapsedTime AS
      RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
    + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)

Я использовал это для вычисляемого столбца, но вы могли бы просто переписать его как UDF или вычисление запроса. Обратите внимание, что эта логика округляет доли секунды; От 00: 00.00 до 00: 00.999 считается равным нулю секунд и отображается как «00:00:00».

Если вы предполагаете, что периоды могут длиться более нескольких дней, этот код при необходимости переключается на формат D: HH: MM: SS:

ElapsedTime AS
    CASE WHEN DATEDIFF(S, StartDate, EndDate) >= 359999
        THEN
                          CAST(DATEDIFF(S, StartDate, EndDate) / 86400        AS VARCHAR(7)) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 86400 / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %  3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %    60        AS VARCHAR(2)), 2)
        ELSE
              RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate)        / 3600 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) % 3600 /   60 AS VARCHAR(2)), 2) + ':'
            + RIGHT('0' + CAST(DATEDIFF(S, StartDate, EndDate) %   60        AS VARCHAR(2)), 2)
        END
5 голосов
/ 03 августа 2018

Я попробовал этот способ, и это сработало. Я использовал SQL Server версии 2016

SELECT DATEDIFF(MILLISECOND,'2010-01-22 15:29:55.090', '2010-01-22 15:30:09.153')/1000.00;

Различные функции DATEDIFF:

SELECT DATEDIFF(year,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(quarter,     '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(month,       '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(dayofyear,   '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(day,         '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(week,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(hour,        '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(minute,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(second,      '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');
SELECT DATEDIFF(millisecond, '2005-12-31 23:59:59.9999999', '2006-01-01 00:00:00.0000000');

Ссылка: https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

5 голосов
/ 22 января 2010

Внутренне в SQL Server даты хранятся как 2 целых числа. Первое целое число - это число дат до или после базовой даты (1900/01/01). Второе целое число хранит количество тактов после полуночи, каждый такт составляет 1/300 секунды.

Подробнее здесь

Из-за этого я часто нахожу самый простой способ сравнить даты - просто вычесть их. Это обрабатывает 90% моих случаев использования. Например,

select date1, date2, date2 - date1 as DifferenceInDays
from MyTable
...

Когда мне понадобится ответ в единицах, отличных от дней, я буду использовать DateDiff .

4 голосов
/ 19 сентября 2016

Следующий запрос должен дать именно то, что вы ищете.

select datediff(second, '2010-01-22 15:29:55.090' , '2010-01-22 15:30:09.153')

Вот ссылка из MSDN на все, что вы можете сделать с помощью функции datediff. https://msdn.microsoft.com/en-us/library/ms189794.aspx

2 голосов
/ 15 января 2019

Хорошо, мы все знаем, что ответ включает DATEDIFF(). Но это дает вам только половину результата, за которым вы можете быть. Что если вы хотите получить результаты в удобочитаемом формате, в виде минут и секунд между двумя значениями DATETIME?

Функции CONVERT(), DATEADD() и, конечно, DATEDIFF() идеально подходят для более удобочитаемого результата, который ваши клиенты могут использовать вместо числа.

1010 * т.е. *

CONVERT(varchar(5), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

Это даст вам что-то вроде:

HH: MM

Если вы хотите большей точности, просто увеличьте VARCHAR().

CONVERT(varchar(12), DATEADD(minute, DATEDIFF(MINUTE, date1, date2), 0), 114) 

HH: MM.SS.MS

2 голосов
/ 28 сентября 2018
SELECT DATEDIFF(yyyy, '2011/08/25', '2017/08/25') AS DateDiff

Это дает вам разницу между двумя датами в Годе

Здесь (2017-2011) = 6 в результате

Синтаксис:

DATEDIFF(interval, date1, date2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...