Tenho a média de vários datediffs convertidos em segundos e queria exibi-los como um timestamp, o problema é que alguns números maiores que outros me dão um timestamp menor, como posso obter os tempos corretos? Exemplo: esses são 4 valores diferentes que preciso converter
select CONVERT(CHAR(8), DATEADD(ss, 147588, 0), 108)
union all
select CONVERT(CHAR(8), DATEADD(ss, 63297, 0), 108)
union all
select CONVERT(CHAR(8), DATEADD(ss, 67232, 0), 108)
union all
select CONVERT(CHAR(8), DATEADD(ss, 97230, 0), 108)
E esta é a saída
16:59:48
17:34:57
18:40:32
03:00:30
Editar: por hora correta, quero dizer que preciso obter o número de horas (como 40:23:56)
Algo como:
parece funcionar .
Editar: Bem, na verdade:
deve ser melhor, para o caso em que a contagem de minutos, ou a contagem de segundos, está entre
00
e09
, e você quer esse zero à esquerda.Isso é completamente esperado. Você está adicionando segundos ao
datetime
0
(1900-01-01 00:00:00
) e então convertendo esse valor para string (não umtime
) no formatohh:mm:ss
. Alguns dos seus valores são maiores do que há segundos em um dia (86400), então você obtém o tempo para a data relevante.Exemplo
CONVERT(CHAR(8), DATEADD(ss, 147588, 0), 108)
:datetime
1900-01-01 00:00:00
:1900-01-02 16:59:48.000
varchar
, no formatohh:mm:ss
:'16:59:48'
Portanto, os resultados estão corretos, pois você está comparando a hora do dia com outra hora do dia; a data é irrelevante. 18:40:32 é depois de 16:59:48, quando você não considera a data.
Você quer a duração como hh:mm:ss (com até 99 horas) ao que parece. Use matemática inteira para isso:
(Isso só funciona se sua coluna secs for um inteiro do tipo
INT
. Se for um inteiro do tipoDECIMAL(..., 0)
, por exemplo, você terá que convertê-lo primeiro.)Demonstração: https://dbfiddle.uk/hvM24mqM