У меня есть 2 столбца в моей таблице на сервере sql - [Время появления (NT)] и [Время зазора (NT)], имеющее формат yyyy-mm-dd hh: mm: ss и третий столбец [Продолжительность вылета] с формат hh: mm: ssКак рассчитать разницу между двумя полями datetime (yyyy-mm-dd hh: mm: ss) в формате времени (hh: mm: ss) в sql-сервере?
[Идентификатор] | [Время появления (NT)] | [Время простоя (NT)] | [Продолжительность простоя]
4 | 2014-12-28 15: 06: 33.000 | 2014-12-28 15: 18: 18.000 | 00: 11: 45,000
длительность перелива рассчитывается как разность [Вхождение времени (NT)] и [Время очистки (NT)] В настоящее время мой код, чтобы сделать это следующим образом:
select distinct a.[Identifier]
,a.[Occurrence Time(NT)]
,a.[Clearance Time(NT)]
,cast((cast(a.[Clearance Time(NT)] as datetime) - cast(a.[Occurrence Time(NT)]as datetime)) as time)
as [Outage Duration]
from final_report_2 a
Листинг просто отказоустойчив, поскольку оба столбца уже имеют дату и время. Этот код работает во всех случаях, когда [Время появления (NT)] и [Время зазора (NT)] выпадают в тот же день, то есть отключение в течение 24 часов
Например, в приведенном выше номере. 4 оба имеют 28-е число в день, и, следовательно, исчисление рассчитывается правильно.
Но продолжительность простоя ошибочно рассчитана в случае разных дней.
2678 | 2014-12-28 12: 50: 04.000 | 2014-12-31 23: 59: 59.000 | 11: 09: 55.000
В строке 2678 время должно быть 83:09:55 вместо 11:09:55.
Так что мне нужно также учитывать разницу между днями, а затем вычислить продолжительность [Outage duration] в формате hh: mm: ss.
Один из возможных способов сделать это заключается в следующем:
(23:59:59 - 12:50:04) + 00:00:01 + ((31-28-1) * 24): 00: 00 + 23:59:59
где первая часть вычисляет время первого дня, затем вторая часть вычисляет значение no. целых дней между [Время появления (NT)] и [Время зазора (NT)] и умножает его на 24, а заключительная часть представляет время последнего дня.
Как я могу реализовать выше в sql-сервере? Можно ли использовать функции DATEPART или DATEADD?