датированный (второй, @ date1, @ date2)Как конвертировать DateDiff обратно в datetime?
Точная разница между 2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... выход должен составлять 5 месяцев, x дней, y часов, z минут, м секунд.
датированный (второй, @ date1, @ date2)Как конвертировать DateDiff обратно в datetime?
Точная разница между 2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... выход должен составлять 5 месяцев, x дней, y часов, z минут, м секунд.
Это сложнее, чем я изначально думал: расчеты месяцев и дней сложны. Вот попытка. Вы должны проверить его тщательно, я полагаю 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))
2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... Я хочу, чтобы результат был 5 месяцев, x дней, y часов, z минут, м секунд. –
@ParulSingla Я исправил запрос, а не результат. Оба обновлены сейчас –
собирается переписать расчет для этого, как и другие ответы. Он не будет на 100% точным в течение месяцев. –
Вам нужно, чтобы часы и минуты? Вы можете использовать DateAdd до 0 Дата
dateadd(second, amount, 0)
А затем преобразовать его в подходящий формат с помощью преобразования и параметры форматирования, такие как 108.
convert(varchar, dateadd(second, amount, 0), 108)
Я могу делать часы минуты и секунды .. но для этого я хочу год, месяцы, дни, а также –
Да, это работает только для меньших единиц времени, которое, как я полагал, было измерено за считанные секунды, так как на тот момент вопрос не был Не упоминайте дни или месяцы. –
datediff
имеет 3 параметра, а не 2: datediff(daypart, startdate, enddate)
. Если вам нужна разница в секундах, используйте datediff(second, @date1, @date2)
.
Чтобы преобразовать его в datetime, используйте dateadd(datepart, number, startdate)
. Например. dateadd(second, @diffResult, '1900-01-01')
. Для даты начала выберите тот, который соответствует вашим потребностям.
Как бы вы относили секунды к типу данных 'datetime'? С 0000 года? Имеет ли это смысл? Вы можете сделать это с помощью «dateadd». – NickyvV
Я хочу точную разницу между 2004-09-01 09: 56: 11.000 и 2005-02-02 08: 54: 02.000 ... выход должен быть 5 месяцев, x дней, y часов, z минут, м секунд. –