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

Firebird

20/06/2012

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

Curtidas 0

Respostas

William

William

20/06/2012

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.
GOSTEI 0
Emir Neto

Emir Neto

20/06/2012

Ok, mas como é hora...
GOSTEI 0
Joel Rodrigues

Joel Rodrigues

20/06/2012

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

Emir Neto

20/06/2012

Meu amigo, tenho que saber (batida1 - batida2) + (batida3 - batida4) entende????
GOSTEI 0
Gustavo Bretas

Gustavo Bretas

20/06/2012

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!
GOSTEI 0
Deivison Melo

Deivison Melo

20/06/2012

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!!
GOSTEI 0
Deivison Melo

Deivison Melo

20/06/2012

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!
GOSTEI 0
POSTAR