Somando horas com em Campos Varchar

Firebird

22/10/2004

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

Tap_pedroso

Curtidas 0

Respostas

Tap_pedroso

Tap_pedroso

22/10/2004

tentei o seguinte codigo:
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

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+


GOSTEI 0
Tap_pedroso

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

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::

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

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+


GOSTEI 0
POSTAR