Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Время выполнения в формате ЧЧ:ММ:СС  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Есть время начала выполнения скритпа и время окончания выполнения.
Как вывести время выполнения скрипта формате: ЧЧЧЧ:ММ:СС, с учетом, что ЧЧ может быть более 24 часов.
27 авг 13, 14:53    [14760831]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
Попробовал так, работает:
declare @beg as varchar
declare @end as varchar
set @beg = '2013-05-01 00:00:00'
set @end = getdate()
select right('000' + cast(datediff(hh, @beg,@end) as varchar(3)),3) + ':' + right('00' + cast(datepart(mi, @end - @beg) as varchar(2)),2) + ':' + right('00' + cast(datepart(ss, @end - @beg) as varchar(2)),2)
27 авг 13, 15:09    [14760902]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
Гость333
Member

Откуда:
Сообщений: 3683
=Сергей=
Попробовал так, работает:

Это вам только так кажется. Посчитайте таким способом время выполнения, если @beg = 01.08.2013 23:59:59, а @end = 02.08.2013 00:00:01.
27 авг 13, 15:15    [14760945]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31868
=Сергей=
Попробовал так, работает:
Не может это работать, нельзя вычитать строки.
27 авг 13, 16:57    [14761996]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
mike909
Member

Откуда:
Сообщений: 662
=Сергей=,
А так пойдет ?
select FORMAT(h.hh, '0000:') + FORMAT(m.mm, '00:') + FORMAT(s.ss, '00') as [Res]
from (values (dateadd(second, -35, dateadd(minute, -20, dateadd(hour, -800,GetDate()))), GetDate()) ) as t(dtStart, dtStop)
--from( values (GetDate(), GetDate()) ) as t(dtStart, dtStop)
--from( values ('2013-07-25 07:46:03.093',	'2013-08-27 16:06:33.093')) as t(dtStart, dtStop)
--from( values (cast('01.08.2013 23:59:59' as datetime),cast('02.08.2013 00:00:01' as datetime))) as t(dtStart, dtStop)
cross apply( 
  SELECT h.hh - CASE WHEN dateadd(HH, h.hh, t.dtStart) > t.dtStop then 1 else 0 end as [hh]
  FROM ( values (datediff(HH, t.dtStart, t.dtStop)) ) as h(hh)
) as h
cross apply( 
  select m.mm - case when dateadd(MI, m.mm, dateadd(HH, h.hh, t.dtStart)) > t.dtStop then 1 else 0 end as [mm]
  from (values (datediff(MI, dateadd(HH, h.hh, t.dtStart), t.dtStop))) as m(mm)  
) as m
cross apply( 
  select s.ss
  from (values (datediff(SECOND, dateadd(minute, m.mm, dateadd(hour, h.hh, t.dtStart)), t.dtStop)) ) as s(ss)  
) as s
27 авг 13, 17:04    [14762051]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
капец
Guest
что вообще за хреномуть даты в строки пихать, чтоб над ними вычисления производить?
находите разницу дат в секундах, выделяйте минуты и часы, форматируйте как угодно
Вы вообще видели, что в строки напихалось?

declare @beg as varchar
declare @end as varchar
set @beg = '2013-05-01 00:00:00'
set @end = getdate()

select @beg, @end 
--------------------
(No column name)	(No column name)
2	A


все еще это хочется вычитать?
27 авг 13, 17:16    [14762131]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
=Сергей=
Member

Откуда:
Сообщений: 334
капец
находите разницу дат в секундах, выделяйте минуты и часы, форматируйте как угодно

Я так и сделал в итоге - самый верный способ!
29 авг 13, 16:20    [14771890]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
как-то так

CREATE function dbo.get_datetime_diff (@db DateTime, 
                                @de DateTime)
RETURNS  varchar(250) 
AS 
BEGIN

 declare    @y numeric(10), 
            @m numeric(10), 
            @d numeric(10), 
            @h numeric(10),            
            @n numeric(10), 
            @s numeric(10),  
            @c numeric(10),
            @result varchar(250)

set @result = '' 

if IsDate(@db) = 0 
begin
set @result = convert(varchar(50), @db) + ' - Не ДатаВремя'
RETURN @result
end

if IsDate(@de) = 0 
begin
set @result = convert(varchar(50), @de) + ' - Не ДатаВремя'
RETURN @result
end



if @de = @db 
set @result = 'Разницы нет'  
          
--************************
  set @y=DATEDIFF(year, @db, @de)

  set @db=DATEADD(year, @y, @db)
  if @db>@de begin
    SET @y=@y-1
    set @db=DATEADD(year, -1, @db)
  end
--************************
  set @m=DATEDIFF(month, @db, @de)

  set @db=DATEADD(month, @m, @db)
  if @db>@de begin
    SET @m=@m-1
    set @db=DATEADD(month, -1, @db)
  end
--************************
  set @d=DATEDIFF(day, @db, @de)

  set @db=DATEADD(day, @d, @db)
  if @db>@de begin
    SET @d=@d-1
    set @db=DATEADD(day, -1, @db)
  end
--************************
  set @h=DATEDIFF(hour, @db, @de)

  set @db=DATEADD(hour, @h, @db)
  if @db>@de begin
    SET @h=@h-1
    set @db=DATEADD(hour, -1, @db)
  end
--************************
  set @n=DATEDIFF(mi, @db, @de)

  set @db=DATEADD(mi, @n, @db)
  if @db>@de begin
    SET @n=@n-1
    set @db=DATEADD(mi, -1, @db)
  end
--************************
  set @s=DATEDIFF(ss, @db, @de)

  set @db=DATEADD(ss, @s, @db)
  if @db>@de begin
    SET @s=@s-1
    set @db=DATEADD(ss, -1, @db)
  end
--************************
  set @c=DATEDIFF(ms, @db, @de)

  set @db=DATEADD(ms, @c, @db)
  if @db>@de begin
    SET @c=@c-1
    set @db=DATEADD(ms, -1, @db)
  end
--************************  
  
 set @result = @result + case 
                    when @y = 0 then ''
                    when @y > 0 or (len(@result) = 0) 
                    then cast(@y as varchar) + case 
                                                when right(cast(@y as varchar),1) in(1,2,3,4) 
                                                then ' г. ' 
                                                else ' л. ' 
                                                end 
                    else '' 
                   end
 set @result = @result + case 
                    when @m = 0 then '' 
                    when @m > 0 or (len(@result) = 0) 
                    then cast(@m as varchar) + ' мес. ' 
                    else '' 
                   end            
 set @result = @result + case 
                    when @d = 0 then '' 
                    when (@d > 0) or (len(@result) = 0) 
                    then cast(@d as varchar) + ' дн. ' 
                    else '' 
                   end                  
 set @result = @result + case 
                    when @h = 0 then '' 
                    when (@h > 0) or (len(@result) = 0) 
                    then cast(@h as varchar) + ' час. ' 
                    else '' 
                   end                   
 set @result = @result + case 
                    when @n = 0 then '' 
                    when (@n > 0) or (len(@result) = 0) 
                    then cast(@n as varchar) + ' мин. ' 
                    else '' 
                   end   
 set @result = @result + case 
                    when @s = 0 then '' 
                    when (@s > 0) or (len(@result) = 0) 
                    then cast(@s as varchar) + ' сек. ' 
                    else '' 
                   end      
 set @result = @result + case 
                    when @c = 0 then '' 
                    when (@c > 0) or (len(@result) = 0) 
                    then cast(@c as varchar) + ' мс. ' 
                    else '' 
                   end      
                                               
if @result = '' or @result is null                
set @result = 'нет данных'
 
RETURN @result
END
go
2 сен 13, 13:41    [14784075]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
делаешь гетдате перед началом процесса в переменную1 и по окночанию процесса в переменную2
далее более тривиально, функцией получаешь разницу между стартом и эндом
2 сен 13, 13:43    [14784085]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SHKoder
как-то так

CREATE function dbo.get_datetime_diff (@db DateTime, 
                                @de DateTime)
RETURNS  varchar(250) 
AS 
BEGIN

тут какая-то портянка

RETURN @result
END
go

Прикольная функция, но вот результат какой-то странный:
select dbo.get_datetime_diff('20130831 23:59:59', '20130901 00:00:01');
-- 1 дн. 2 сек. 

Я ожидал бы увидеть "2 сек."
2 сен 13, 14:00    [14784210]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Я ошибаюсь или мне правильно кажется, что подобных тем ту было немерянно?
Оперделить интервал между 2 -ми датами.
Как преобразовать ХХХ секунд в дни-часы-минуты-секунды?

Это только несколько тем только из тех, где я сам участвовал...
2 сен 13, 14:12    [14784275]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
Гость333
Прикольная функция, но вот результат какой-то странный:
select dbo.get_datetime_diff('20130831 23:59:59', '20130901 00:00:01');
-- 1 дн. 2 сек. 

Я ожидал бы увидеть "2 сек."

o_O
подправлю, реально косяк
2 сен 13, 14:33    [14784397]     Ответить | Цитировать Сообщить модератору
 Re: Время выполнения в формате ЧЧ:ММ:СС  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Главное не использовать эту функцию для отображения параметров аля "длительность выполнения заявки человеком" или "длительность шуршания мозга над задачей". Допустим человек приступил к задаче за 5 минут до конца рабочего дня, а завершил ее через 5 минут после начала. Итого потратил 10 минут по факту. А мы имеем две datetime из которых 10 минут ну никак не складываются.
2 сен 13, 14:50    [14784511]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить