Fórum Não sei como oter total de horas de um determinao período em sql. Alguém pode me ajudar? #418767

20/06/2012

0

Preciso de uma consulta que retorne a diferença de hora entre quatro horas. Vou explicar melhor:
Tenho os capos:
- Data
- Batida1
- Batida2
- Batida3
- Batida4

A Data é do tipo date e os campos batida1,2,3 e 4 são varchar(5), no banco o formato é 99:99.
Precisaria do total de horas em uma determinada data, tem como?
Emir Neto

Emir Neto

Responder

Posts

20/06/2012

William

Colega realizar operações matemáticas com campos do tipo varchar é meio complicado hein, mesmo se fosse em linguagem de programação normal já teria o perigo de perda de informações realizando uma conversão.
Responder

Gostei + 0

20/06/2012

Emir Neto

Ok, mas como é hora...
Responder

Gostei + 0

20/06/2012

Joel Rodrigues

´´mas como é hora...´´? Hora de que? Vai entender...
Enfim, tenta fazer um cast nos campos, convertendo-os para TIME/TIMESTAMP e somando-os.
Responder

Gostei + 0

20/06/2012

Emir Neto

Meu amigo, tenho que saber (batida1 - batida2) + (batida3 - batida4) entende????
Responder

Gostei + 0

21/06/2012

Gustavo Bretas

E ae Emir, tranquilo?

Eu não estou com o firebird aqui para fazer o teste pra vc, e não lembro quais o tipos para datas dele, mas faz o seguinte teste:
cast(batida2 as datetime) - cast(batida1 as datetime)


Se o tipo não for datetime, substitua pelo tipo que existe no firebird!
Responder

Gostei + 0

21/06/2012

Deivison Melo

Boa tarde amigo,

Veja se isso ajudará vc!

Essa procedure faz parte de um artigo sobre tipos date e time escrito por mim e publicado na revista ClubeDelphi #48 que também traz toda a explicação de como a procedure funciona


CREATE PROCEDURE INFO_PERIODO (
INICIO TIMESTAMP,
FIM TIMESTAMP)
RETURNS (
DIAS INTEGER,
HORAS INTEGER,
MINUTOS INTEGER,
SEGUNDOS INTEGER)
AS
DECLARE VARIABLE TEMP NUMERIC(18,7);
BEGIN
/* Inicializa variáveis */
dias = 0; horas = 0; minutos = 0; segundos = 0;
/* Temp armazena a diferenca do periodo, em dias e frações de dias */
temp = (fim - inicio);
/* Pega o numero de dias - parte inteira */
if (temp > 0) then dias = temp - 0.5; else dias = temp;
/* extraí os dias do timestamp, deixando apenas hora/min/seg */
temp = temp - dias;
/* Um dia tem 86.400 segundos, assim transformamos o valor
que temos em total em segundos */
temp = temp * 86400;
horas = (temp / 3600); /* Uma hora tem 3.600 segundos */
if (horas > 0) then horas = horas - 0.5;
temp = temp - (horas*3600); /* Temp vale agora minutos e segundos */
minutos = (temp / 60); /* Um minuto tem 60 segundos */
if (minutos > 0) then minutos = minutos - 0.5;
segundos = temp - (minutos * 60); /* Para finalizar extrai os segundos */
END


Crédidos: Firebase.com.br

Qualquer coisa me fala que vemos uma outra solução que possa atender vc!!
Responder

Gostei + 0

21/06/2012

Deivison Melo

Apenas lembrando que as informações passadas são para base de dados firebird ou interbase, caso esteja utilizando outra base de dados (Oracle, MS SQL Server, MySQL ou Postgres) me fala que damos uma solução especifica a base que estiver utilizando!
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar