Não sei como oter total de horas de um determinao período em sql. Alguém pode me ajudar?
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?
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
Curtidas 0
Respostas
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
20/06/2012
Ok, mas como é hora...
GOSTEI 0
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.
Enfim, tenta fazer um cast nos campos, convertendo-os para TIME/TIMESTAMP e somando-os.
GOSTEI 0
Emir Neto
20/06/2012
Meu amigo, tenho que saber (batida1 - batida2) + (batida3 - batida4) entende????
GOSTEI 0
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:
Se o tipo não for datetime, substitua pelo tipo que existe no firebird!
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
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!!
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
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