Fórum Soma de horas #364500

30/09/2008

0

Estou precisando fazer uma somatoria de horas que inicia antes das 00:00 e terminara apos as 00:00, exemplo inicio 18:00 para as 21:30 retorna as 22:30 e terminara as 02:00, alguem poderia me ajudar com esse probleminha.

Obrigado


Felipeiw

Felipeiw

Responder

Posts

01/10/2008

Micheus

[b:ca9199ecb0]felipeiw[/b:ca9199ecb0], esta informação vai para o banco de dados com um campo com a data?
Se for, combine a data e a hora de início, bem como a data e hora de termino e depois faça a diferença entre eles (vc terá dois TDateTime). Ex.:
DifHora1 := (DtTermino1 +HrTermino1) -(DtInicio1 +HrInicio1);
DifHora2 := (DtTermino2 +HrTermino2) -(DtInicio2 +HrInicio2);
SomaHora := DifHora1 +DifHora2;


O tipo TDateTime (que é na verdade um Double), representa a quantidade de dias decorridos desde 12/30/1899, então, a subtração de um do outro vai resultar no número de anos, meses, dias, horas, minutos... decorridos entre as mesmas.

Abraços


Responder

Gostei + 0

01/10/2008

Felipeiw

Obrigado Micheus, pela ajuda, porem outra duvida, no seu exemplo vc esta tratando os campos data e hora separados, com o campo data sendo um DATE e o campo hora sendo um TIME ?


Responder

Gostei + 0

01/10/2008

Micheus

Obrigado Micheus, pela ajuda, porem outra duvida, no seu exemplo vc esta tratando os campos data e hora separados, com o campo data sendo um DATE e o campo hora sendo um TIME ?
voce estará fazendo esta operação direto em um SQL ou seria no código mesmo?
Se for no SQL, que banco de dados vc está usando?
Se for no código, não há problemas, e seria a mesma coisa, porque vc tem neste seu caso campos TDateField e TTimeField, onde vc pode realizar a operação citada usando a propriedade [i:cee7c37084]Value[/i:cee7c37084], tipo:
TabPontoDtEntrada1.Value +TabPontoHrEntrada1.Value ....


Responder

Gostei + 0

01/10/2008

Felipeiw

Estou utilizando Firebird e D7 com DBExpress. Como faço um select para trazer os registros de um determinado periodo levando em consideracao a data e a hora lancada, os campos datas estou utilizando timestamp e os campos horas time. Portando estou utilizando em campos separados, nao sei se é a melhor ideia tambem.

Obrigado


Responder

Gostei + 0

02/10/2008

Micheus

Segue um exemplo de como poderia ser feito, levando em conta as informações que vc passou (ajuste ao nome de seus campos):
select (cast(N.DTENTRADA as date) +N.HRENTRADA1) as Entrada1,
(cast(N.DTENTRADA as date) +N.HRSAIDA1) as Saida1,
((cast(N.DTENTRADA as date) +N.HRSAIDA1) -(cast(N.DTENTRADA as date) +N.HRENTRADA1)) as Diferenca1
from Tabela
observe que é necessário fazer um CAST do campo TIMESTAMP para DATE e que o resultado da soma em Entrada1 e Saida1 será um TIMESTAMP (com a data e hora concatenados). Já a diferença, resultará em um número real, logo, o dataset deve retornar um [i:89230ef620]TFloatField[/i:89230ef620]. Este valor, se multiplicado por 24 (24horas) resultará na diferença em horas (ex. 02:30hs, será representado por 2,5hs) podendo ser usado em operações matemáticas normalmente.
Já para ser mostrado no formato hh:mm, se for necessário, há duas possibilidades: usar os eventos [i:89230ef620]OnGetValue[/i:89230ef620] e [i:89230ef620]OnSetValue[/i:89230ef620] do field ou usar um campo calculado, do tipo TDateTime e atribuir este valor a ele.

Quanto a ser melhor o uso de timestamp, date ou time, acho que deve ser um opção pessoal. Particularmente, quando necessito armazenar data e hora juntos eu uso o timestamp. Do contrário, uso os tipos conforme o caso - date e/ou time.

Abraços


Responder

Gostei + 0

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

Aceitar