Fórum Somar Horas com FireBird ou Com Delphi #492895

20/09/2014

0

Bom dia Pessoal, gostaria de saber como faço a soma de horas usando Firebird.

Eu tenho uma coluna do tipo TIME, e nela eu recebo o tempo trabalhado de cada funcionário, assim: 00:15:35 ou 01:59:01 e assim por adiante, sendo HH:MM:SS.

Eu quero fazer um select que some estes valores me informando o total de horas que eu trabalhei visando que ao atingir 23:59:59 ele continue para 24:00:00 e não para 00:00:00.


Outra opção seria fazer essa soma pelo Delphi, fazer um select na coluna com as horas e utilizar alguma função nativa do Delphi para somar as horas com a mesma regra acima.

O importante é: Eu preciso fazer essa soma para mostrar em meu relatório.

Utilizo Delphi XE, Firebird 2.5 e Report Builder 14. Quem puder me ajudar ficarei muito agradecido.

OBS: Isto é urgente :D
Marlon Minotti

Marlon Minotti

Responder

Post mais votado

20/09/2014

Veja se os links abaixo te ajudará em sua empreitada:

[url]
https://www.devmedia.com.br/data-e-hora-no-firebird/15161
[/url]


[url]
http://firebase.com.br/pipermail/lista_firebase.com.br/2004-October/001149.html
[/url]


[url]
http://www.activedelphi.com.br/forum/viewtopic.php?t=29166&sid=07395e0951b593b90085dd42bd98ab28
[/url]


[url]
http://comments.gmane.org/gmane.comp.db.firebase.portuguese/96022
[/url]


[url]
http://www.arquivodecodigos.net/dicas/firebird-aprenda-a-usar-os-tipos-de-dados-date-time-e-timestamp-do-firebird-3252.html
[/url]


Caso não te ajudar, por favor, sinalizar para que possa ajudá-lo!

Abração e bons códigos!

Emanoel Deivison
Recife - PE

Deivison Melo

Deivison Melo
Responder

Gostei + 1

Mais Posts

22/09/2014

Marlon Minotti

Bom dia Deivison, o que chegou mais próximo foi o terceiro, ACTIVEDELPHI, que eu já havia lido, porém não consegui executar e não entendi muito bem..


Se você puder me ajudar de forma que atenda o que estou precisando eu ficaria muito agradecido.

Contudo, obrigado pela ajuda até o momento..

Aguardo
Responder

Gostei + 0

23/09/2014

Deivison Melo

Poste o seu código e detalhe ao máximo seu problema atual!
Responder

Gostei + 0

24/09/2014

Tone Costa.

Quando vou trabalhar com horas eu armazeno um integer com os segundos

encodeDateTime(data,ano,mes,dia,hora,minuto,segundo);

hora := (hora * 60 * 60) + (minuto * 60) + segundo;


e depois trabalho com esses valores.

Uma Funcao para Transformar Horas em Integer e depois um integer para horas
Responder

Gostei + 0

24/09/2014

Marlon Minotti

Eu não tenho código ainda, mas vou simplificar meu problema.

Temos um sistema de atendimentos.
Ao realizar um atendimento é gravado no banco de dados (Firebird) a data e hora de abertura.
Ao Fechar esse atendimento é gravado a data e hora de fechamento e já calculado o tempo gasto no atendimento. EXEMPLO:
Abri um atendimento às 08:10:15 e fechei às 08:20:30. O tempo gasto em meu atendimento é de 00:10:15.

Mediante este cenário eu preciso fazer um relatório dentro do sistema. Neste relatório eu preciso mostrar informações completas de todos os meus Atendentes. Quantos atendimentos abertos, quantos atendimentos fechados, suspensos, eeeeeeeeeee o Total de Horas Trabalhadas em Atendimentos, ou seja, a soma do TEMPO GASTO EM CADA ATENDIMENTO.

Entendeu? No meu relatório eu preciso somar todos o tempo gasto em cada atendimento. EXEMPLO:

Realizei 5 atendimentos no dia. 1º - 00:15:20, 2º - 00:05:00, 3º - 05:35:50, 4º - 01:01:10, 5º 00:02:00.
A soma de todos esses tempo gasto é: 06:59:20 em Horas/Minutos/Segundos.

Entendeu o meu problema?
Responder

Gostei + 0

24/09/2014

Tone Costa.

talvez te ajude a rotina abaixo, aí é só adaptar ao seu problema
unit uteste;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function converterDataEmSegundos(Data : TDateTime) : Integer;
function obterTempoUtilizado (value : Integer) : String;
end;

var
Form1: TForm1;

implementation

uses DateUtils;

{$R *.dfm}

{ TForm1 }

function TForm1.converterDataEmSegundos(Data: TDateTime): Integer;
var
ano,mes,dia,hora,minuto,segundo,milisegundo : word;
begin
decodeDatetime(data,ano,mes,dia,hora,minuto,segundo,milisegundo);
// Tempo em Segundos
result := segundo + (minuto * 60) + (hora * 60 * 60) + (ano * DayOfTheYear(data) * 24 * 60 * 60);
end;

procedure TForm1.Button1Click(Sender: TObject);
Var
tempoGasto, ini001, fin001, ini002, fin002, ini003, fin003 : Integer;

begin
// Primeiro atendimento
ini001:= converterDataEmSegundos(StrToDateTime('24/09/2014 08:00:00'));
fin001:= converterDataEmSegundos(StrToDateTime('24/09/2014 09:10:00'));
tempogasto := fin001 - ini001;
ShowMessage(obterTempoUtilizado(tempoGasto));
end;

function TForm1.obterTempoUtilizado(value: Integer): String;
Var
horas, minutos,segundos : Integer;
begin
horas := value div 3600;
value := value - (horas * 3600);
minutos := value div 60;
segundos := value - (minutos * 60);
result := TimeToStr(EncodeTime(horas,minutos,segundos, 0));
end;

end.
Responder

Gostei + 0

24/09/2014

Marlon Minotti

Tá, não sei se você entendeu, mas o Tempo do Atendimento já está salvo no banco de dados. Como eu vou trazer ele do banco para dentro do Delphi, tratar essas informações, somar a hora e depois mostrar no relatório?

Eu não sei.
Responder

Gostei + 0

24/09/2014

Marlon Minotti

Consegui galera. Finalmente consegui.

Deivison, utilizei aquele post do ActiveDelphi.

Se liga no select que resolveu minha vida:

select
atendentee as Atendente,
total as "Total Atendimentos",
Fechados,
Pendentes,
Suspensos,
case when (HORA/3600) < 10 then '0'||(HORA/3600) else (HORA/3600) end ||':'||
case when ((HORA-((HORA)/3600)*3600)/60) < 10 then '0'||((HORA-((HORA)/3600)*3600)/60) else ((HORA-((HORA)/3600)*3600)/60) end ||':'||
case when (HORA - (HORA/3600)*3600 - ((HORA-((HORA)/3600)*3600)/60)*60 ) < 10
then '0'||(HORA - (HORA/3600)*3600 - ((HORA-((HORA)/3600)*3600)/60)*60 ) else
(HORA - (HORA/3600)*3600 - ((HORA-((HORA)/3600)*3600)/60)*60 ) end
from(SELECT s.atendente as atendentee,
count(*) as total,
count(case when s.status = 1 then 1 end) as Fechados,
count(case when s.status = 0 then 1 end) as Pendentes,
count(case when s.status = 2 then 1 end) as Suspensos,
CAST(SUM(
EXTRACT( HOUR FROM s.hora_total ) * 3600 +
EXTRACT( MINUTE FROM s.hora_total ) * 60 +
EXTRACT( SECOND FROM s.hora_total )) AS integer) AS HORA
FROM servicos s where 1=1 group by s.atendente)

Demorei muito pra entender como funcionava essa parada de select dentro de outro, mas entendi. Pode ser que sirva pra alguém.

Abraço pessoal.
Responder

Gostei + 0

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

Aceitar