Somando horas com em Campos Varchar
eu tenho uma tabela aqui que armazena horas essas horas tem q ser somadas e poderão chegar até 500 horas totais só que o campo onde está essas horas é do tipo varchar e eu estou pensando em fazer uma procedure no banco para fazer esse calculo só q eu não me lembro do comando para converter esse valores de string para hora em sql.alguém aí lembra?
Tap_pedroso
Curtidas 0
Respostas
Tap_pedroso
22/10/2004
tentei o seguinte codigo:
mas deu erro :lol:
SET TERM # ; CREATE PROCEDURE SOMAHORAS(DATA1 DATE, DATA2 DATE, CODFUNC VARCHAR(13))RETURNS (FUNC VARCHAR(13), HORAS TIMESTAMP)AS BEGIN FOR SELECT CODFUNCBARRAS, SUM (CAST(TOTAL AS TIMESTAMP))AS HORAS FROM CARGAHORA WHERE CODFUNCBARRAS=:CODFUNC AND DATA BETWEEN :DATA1 AND :DATA2 INTO :FUNC, :HORAS DO SUSPEND; END SET TERM ;
mas deu erro :lol:
GOSTEI 0
Afarias
22/10/2004
o problema é q vc não pode somar horas (no formato de hora ou datahora) -- a melhor forma de guardar horas para cálculos desse tipo é como um número, ex::
2:30 = 2,5
Até pq, como vc mesmo disse as horas podem ir até 500h... mas no formato de hora sua intenção é guardar a quantidade de horas de 1 dia que é no máximo 24h (0:00 à 23:59) -- e ainda assim, não é uma quantidade, mas um ´estado´
T+
2:30 = 2,5
Até pq, como vc mesmo disse as horas podem ir até 500h... mas no formato de hora sua intenção é guardar a quantidade de horas de 1 dia que é no máximo 24h (0:00 à 23:59) -- e ainda assim, não é uma quantidade, mas um ´estado´
T+
GOSTEI 0
Tap_pedroso
22/10/2004
pois é afarias eu peguei o banco guardando horas desse jeito será que tem como converter esses valores para um outro formato?
GOSTEI 0
Afarias
22/10/2004
claro, ... adicione um campo na tabela para guardar as horas no formato numérico, numeric(9,2) por exemplo, e então converta os valores varchar para este campo -- mas vc terá q usar uma aplicação para isso (em Delphi por ex.) -- pois, pelo banco só com uso de UDfs
uma forma de converter no Delphi seria::
veja q não converto a hora em string para DateTime, pq pode haver algum valor como ´28:30´ que resultaria em erro.
Bom, esse mesmo código pode ser executado no banco, mas vc tem q usar pelo menos uma função SubString, q no IB ou FB < 1.5 só com UDF
T+
uma forma de converter no Delphi seria::
var
s: string;
h, m: Integer;
s := FieldByName(´hora´).AsString; { ´09:40´ }
h := StrToInt(Copy(s, 1, Pos(´:´, s)-1));
m := StrToInt(Copy(s, Pos(´:´, s)+1, 2));
FieldByName(´hora2´).AsCurrency := h + (m/60);
veja q não converto a hora em string para DateTime, pq pode haver algum valor como ´28:30´ que resultaria em erro.
Bom, esse mesmo código pode ser executado no banco, mas vc tem q usar pelo menos uma função SubString, q no IB ou FB < 1.5 só com UDF
T+
GOSTEI 0
Afarias
22/10/2004
usando a UDF padrão do IB, registrando a UDF substr, ficaria::
update table nome_tabela
set hora2=cast(substr(hora, 1, 2) as integer)+
cast(substr(hora, 4, 5) as integer)/60.0;
T+
update table nome_tabela
set hora2=cast(substr(hora, 1, 2) as integer)+
cast(substr(hora, 4, 5) as integer)/60.0;
T+
GOSTEI 0