Продолжительность T-SQL в часах: минутах: секундах - PullRequest
2 голосов
/ 03 августа 2011

У меня средняя продолжительность между несколькими датами (формат DATETIME), т.е.1900-01-01 01: 30.00.00.Как я могу преобразовать DATETIME в формат часы: минуты: секунды, где часы могут быть больше 24 - формат вывода может быть VARCHAR.

IE.

1 days 12 hours 5 minutes convert to 36:05:00
2 days 1 hour 10 minutes 5 seconds convert to 49:10:05

и т. Д.

DECLARE @date1 DATETIME = '2011-08-03 13:30'
DECLARE @date2 DATETIME = '2011-08-03 13:00'
DECLARE @date3 DATETIME = '2011-08-03 14:00'
DECLARE @abc DATETIME = '2011-08-03 12:00'

select CAST(AVG(CAST(data-@abc as float)) as datetime)
from
(
    select 'data' as label, @date1 as data
union all
select 'data' as label, @date2 as data
union all
select 'data' as label, @date3 as data
) as a
group by label

Я хотел бы получить результат как 01:30:00, что означает, что среднее время составляет 1 час 30 минут.

Я пробовал:

CONVERT(VARCHAR(10), CAST(AVG(CAST(data-@abc as float)) as datetime), 108)

, нотогда я получаю только часть времени в формате ЧЧ: ММ: СС.Когда я установлю @abc = 2011-08-02, тогда результаты будут такими же - это неверно.

С уважением, Марцин

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

В T-SQL дата и время - это именно то, что означает дату и время, когда часы никогда не могут превышать 24, потому что это переносит их на следующий день.Вы можете использовать datepart, чтобы отделить значения datetime и рассматривать их как целые числа, а затем соединять их в нужную строку.В зависимости от вашей конечной цели, вам может быть лучше выполнять этот тип работы на уровне приложений или презентаций, где более общие языки часто имеют более надежные библиотеки времени и даты.

1 голос
/ 03 августа 2011

Я думаю, что вам нужно написать скалярную функцию, которая принимает целочисленный аргумент (разница во времени в секундах) и форматировать ее по мере необходимости.Например,

 CREATE FUNCTION intToDateTime ( @time_in_secs BIGINT) RETURNS VARCHAR(30)
 AS 
 BEGIN
   DECLARE @retval VARCHAR(30);
   SET @retval = cast(@time_in_secs/(60*60) as varchar(10))+':'+
   cast( (@time_in_secs-@time_in_secs/(60*60)*3600)/60 as varchar(10))+':'+
   cast( (@time_in_secs-@time_in_secs/(60)*60) as varchar(10));
 return @retval;
END

Эта функция нуждается в некоторых изменениях - вы можете захотеть отображать начальный ноль для 0-9 (ig '00' вместо '0', как эта функция в настоящее время делает);Кроме того, вам нужно лучше обрабатывать отрицательные значения.
Теперь вы можете использовать его с DATEDIFF(second, @val1,@val2).
Надеюсь, я указал вам правильное направление.

1 голос
/ 03 августа 2011
select cast(cast(cast(t as float) *24 as int) as varchar) + right(convert(varchar,t, 20), 6)
from(
select cast(AVG(CAST(data-@abc as float)) as datetime) t
from 
( 
    select 'data' as label, @date1 as data 
union all 
select 'data' as label, @date2 as data 
union all 
select 'data' as label, @date3 as data 
) as a 
group by label 
) a

Результат:

1:30:00
0 голосов
/ 03 августа 2011

Нельзя конвертировать дату и время для обработки нереальных дат и времени.

Однако вы можете получить вывод, который выглядит как datetime, просто путем объединения строки часов с ':' с минутами и т. Д.

Поиск функций DATEADD() и DATEDIFF() ...

...