Расчет прошедшего времени между двумя датами со временем

Я создал функцию, которая принимает 2 даты и возвращает описательную продолжительность следующим образом:

1 год 3 месяца 2 недели 5 дней 10 часов

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

Может кто-нибудь помочь мне настроить эту функцию?

Вы можете найти запрос здесь:

http://data.stackexchange.com/stackru/query/edit/149306

Как вы видите, я передаю дату начала как 2013-08-29 13:48:35.710 и дата окончания как 2013-09-03 17:04:27.493 и это должно было вернуть продолжительность как 5 days 3 hours 15 minutes но возвращается 1 месяц 3 часа 15 минут.

Как настроить это так, чтобы он отображал правильную продолжительность?

1 ответ

Решение
DECLARE @date1 DATETIME, @date2 DATETIME
DECLARE @result VARCHAR(100)
DECLARE @years BIGINT, @months BIGINT, @weeks BIGINT, @days BIGINT, @hours BIGINT, @minutes BIGINT
DECLARE @KEEP DATETIME

SET @date1 = '20130829 13:48:35.710'
SET @date2 = '20130903 17:04:27.493'

if @date1>@date2 
begin
  SET @KEEP=@date1
  SET @date1=@date2
  SET @date2=@KEEP  
end

Select @years=DATEDIFF(yy,@date1,@date2)
if DateAdd(yy,-@years,@date2)<@date1 Select @years=@years-1
Set @date2= DateAdd(yy,-@years,@date2)

Select @months=DATEDIFF(mm,@date1,@date2)
if DateAdd(mm,-@months,@date2)<@date1 Select @months=@months-1
Set @date2= DateAdd(mm,-@months,@date2)

Select @weeks=DATEDIFF(wk,@date1,@date2)
if DateAdd(wk,-@weeks,@date2)<@date1 Select @weeks=@weeks-1
Set @date2= DateAdd(wk,-@weeks,@date2)        

Select @days=DATEDIFF(dd,@date1,@date2)
if DateAdd(dd,-@days,@date2)<@date1 Select @days=@days-1
Set @date2= DateAdd(dd,-@days,@date2)

Select @hours=DATEDIFF(hh,@date1,@date2)
if DateAdd(hh,-@hours,@date2)<@date1 Select @hours=@hours-1
Set @date2= DateAdd(hh,-@hours,@date2)

Select @minutes=DATEDIFF(mi,@date1,@date2)

Select @result= ISNULL(CAST(NULLIF(@years,0) as varchar(10)) + ' Years','')
     + ISNULL(' ' + CAST(NULLIF(@months,0) as varchar(10)) + ' Months','')
     + ISNULL(' ' + CAST(NULLIF(@weeks,0) as varchar(10)) + ' Weeks','')     
     + ISNULL(' ' + CAST(NULLIF(@days,0) as varchar(10)) + ' Days','')
     + ISNULL(' ' + CAST(NULLIF(@hours,0) as varchar(10)) + ' Hours','')
     + ISNULL(' ' + CAST(@minutes as varchar(10)) + ' Minutes','')

Select @result     

-- OUTPUT :  5 Days 3 Hours 16 Minutes
Другие вопросы по тегам