2015-03-04 3 views
1

датированный (второй, @ date1, @ date2)Как конвертировать DateDiff обратно в datetime?

Точная разница между 2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... выход должен составлять 5 месяцев, x дней, y часов, z минут, м секунд.

+1

Как бы вы относили секунды к типу данных 'datetime'? С 0000 года? Имеет ли это смысл? Вы можете сделать это с помощью «dateadd». – NickyvV

+0

Я хочу точную разницу между 2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... выход должен быть 5 месяцев, x дней, y часов, z минут, м секунд. –

ответ

0

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

DECLARE @date1 datetime = '2004-09-01 09:56:11.000', 
     @date2 datetime = '2005-02-02 08:54:02.000' 

SELECT 
    @date2 - @date1 difference, 
    datediff(month, @date1, @date2) + 
    CASE WHEN dateadd(month, datediff(month, @date1, @date2), @date1)>@date2 
    THEN -1 
    ELSE 0 END month, 
    day(@date2 - dateadd(month, datediff(month, @date1, @date2) 
    + CASE WHEN dateadd(month, datediff(month, @date1, @date2), @date1)>@date2 
     THEN -1 ELSE 0 
     END, @date1)) - 1 day, 
    datepart(hour,@date2 - @date1) hour, 
    datepart(minute,@date2 - @date1) minute, 
    datepart(second,@date2 - @date1) second 

Результат Сейчас:

difference    month day hour minute second 
1900-06-03 22:57:51.000  5 0 22  57  51 

Примечание. Этот ответ не даст вам точно такой же результат, но он будет более точным с округлением секунд.

Больше редактирования:

Если вы можете принять, не имея месяцы, как описано в вашем комментарии и может принимать этот формат х дней чч: мм: сс. Вы можете использовать этот синтаксис:

SELECT 
    CAST((DateDiff(SECOND, @date1, @date2))/86400 AS varchar(7)) + ' days ' 
    + CAST(cast(@date2 - @date1 as time(0)) as char(8)) 
+0

2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... Я хочу, чтобы результат был 5 месяцев, x дней, y часов, z минут, м секунд. –

+0

@ParulSingla Я исправил запрос, а не результат. Оба обновлены сейчас –

+0

собирается переписать расчет для этого, как и другие ответы. Он не будет на 100% точным в течение месяцев. –

1

Вам нужно, чтобы часы и минуты? Вы можете использовать DateAdd до 0 Дата

dateadd(second, amount, 0) 

А затем преобразовать его в подходящий формат с помощью преобразования и параметры форматирования, такие как 108.

convert(varchar, dateadd(second, amount, 0), 108) 
+0

Я могу делать часы минуты и секунды .. но для этого я хочу год, месяцы, дни, а также –

+0

Да, это работает только для меньших единиц времени, которое, как я полагал, было измерено за считанные секунды, так как на тот момент вопрос не был Не упоминайте дни или месяцы. –

0

datediff имеет 3 параметра, а не 2: datediff(daypart, startdate, enddate). Если вам нужна разница в секундах, используйте datediff(second, @date1, @date2).
Чтобы преобразовать его в datetime, используйте dateadd(datepart, number, startdate). Например. dateadd(second, @diffResult, '1900-01-01'). Для даты начала выберите тот, который соответствует вашим потребностям.