Tenho dois valores inteiros, com hora de início 14300000 e hora de término 23000000, procurando o total de minutos entre esses dois valores. Procurando a saída 510.
Tentei o cálculo abaixo, mas obtive a saída 522
Select Cast(((23000000-14300000)/1000000)*60 as Decimal(6,2)) Hours
O verdadeiro problema aqui é a sua escolha de tipo de dado;
int
é a escolha errada por um tempo. O SQL Server tem umtime
tipo de dado e você deveria usá-lo. Se você estivesse usando umtime
, a solução seria trivial: usarDATEDIFF
.Um
int
é uma má escolha por vários motivos. Primeiro, umint
não armazena zeros à esquerda, o que faz com que as coisas pareçam estranhas. O horário 00:00:13.12 seria armazenado em seuint
como "horário"1312
, que poderia ser qualquer coisa . Isso poderia ser facilmente confundido com13:12:00
,00:13:12
, ou mesmo visto como o número de segundos decorridos e00:21:52
também significa (o que seria minha interpretação).int
etime
não funciona da mesma forma quando são incrementados. Há apenas 60 segundos e minutos, e apenas 24 horas. Um valor como256291
é perfeitamente válidoint
, mas o tempo25:62:91
é um completo absurdo.A verdadeira solução aqui é corrigir seu design. Se você quiser armazenar um intervalo (não a hora do dia), use um parâmetro,
int
mas armazene o número de intervalos que passaram, onde o intervalo é o menor valor que você precisa armazenar; isso parece centésimos de segundo nos seus dois exemplos (1/100 de segundo). O SQL Server, no entanto, não tem umaCENTISECOND
opção para suas funções de data e hora, então eu sugeriria usar milissegundos. Isso significa que a hora14:30:00.00
seria armazenada como o valor52200000
.Se você quiser armazenar um tempo , use um
time
.Com os dados que você tem, no entanto, e assumindo que esses valores representam um tempo , não um intervalo (portanto, não podem ter um valor maior que
23595999
), então você pode preencher o valor com uma string de 8 dígitos , injetar os caracteres corretos na string e, em seguida, tentarCONVERT
convertê-lo em umtime
, e finalmente obter o número de minutos: