#sql #sql-server #datetime #sql-server-2008 #difference
#sql #sql-сервер #дата и время #sql-server-2008 #разница
Вопрос:
Я пытаюсь рассчитать продолжительность службы, в которой время в таблице хранится как Char (4) HHMM. Например, время начала равно 1402, что будет 14:02, а время окончания равно 1536, что будет 15:36.
Мне нужно, чтобы оно возвращало длительность 94 минуты. Когда я попытался просто преобразовать в числовое значение и вычесть, я получил 134. Я пытался преобразовать во время, но каждый пример, который я пробовал, выдает мне сообщение о типе преобразования.
Комментарии:
1. У вас есть 3 отличных ответа. У меня есть 1 для каждого. Мне любопытно посмотреть, как это происходит. Я предпочитаю одно из решений, но я оставлю свое мнение при себе 🙂
Ответ №1:
Просто преобразуйте значение в a time
, а затем используйте DATEDIFF
:
SELECT DATEDIFF(MINUTE, CONVERT(time,STUFF(StartTime,3,0,':')),CONVERT(time,STUFF(EndTime,3,0,':')))
FROM dbo.YourTable;
Ответ №2:
Вы можете использовать строковые функции и арифметику:
select t.*,
(left(starttime, 2) * 60 right(starttime, 2) - left(endtime, 2) * 60 - left(endtime)) / 60 minutes_diff
from mytable t
Это преобразует строки в количество секунд, вычитает значения, а затем преобразует обратно в минуты.
Ответ №3:
Вы можете преобразовать разницу в минуты, а затем добавить ее обратно к нулевому времени:
select convert(time,
dateadd(minute,
(((et / 100) * 60) (et % 60)) - (((st / 100) * 60) (st % 60)),
0)
)
from (values (1402, 1536)) v(st, et);
Вот скрипка db<> .
Ответ №4:
Спасибо всем за ответы, но я нашел свой ответ!
DateDiff(Minute, try_cast(substring(c.start_time, 1, 2) ':' substring(start_time, 3, 2) as time),
try_cast(substring(stop_time, 1, 2) ':' substring(c.stop_time, 3, 2) as time))
Комментарии:
1. Конечно, теперь мы никогда не узнаем! Это больше всего похоже на ответ @Larnu, чем
Ответ №5:
Задача: заданы два параметра в виде символа (4)
- 1402, 1536 в формате HHMM
- Возвращает продолжительность в минутах: 15*60 36 — 14*60 02 => 94
Решение:
ВЫБЕРИТЕ (ПРИВЕДЕНИЕ (ПОДСТРОКА (‘1536’, 1,2) КАК int)*60 ПРИВЕДЕНИЕ(ПОДСТРОКА (‘1536’,3,2) КАК int)) — (ПРИВЕДЕНИЕ(ПОДСТРОКА (‘1402’, 1,2) КАК int)*60 ПРИВЕДЕНИЕ(ПОДСТРОКА (‘1402’,3,2) КАК int));