Somar Horas com FireBird ou Com Delphi
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
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
Curtidas 0
Melhor post
Deivison Melo
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
[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
GOSTEI 1
Mais Respostas
Deivison Melo
20/09/2014
Veja se os links abaixo te ajudará em sua empreitada:
[code]
https://www.devmedia.com.br/data-e-hora-no-firebird/15161
[\code]
[code]
http://firebase.com.br/pipermail/lista_firebase.com.br/2004-October/001149.html
[\code]
[code]
http://www.activedelphi.com.br/forum/viewtopic.php?t=29166&sid=07395e0951b593b90085dd42bd98ab28
[\code]
[code]
http://comments.gmane.org/gmane.comp.db.firebase.portuguese/96022
[\code]
[code]
http://www.arquivodecodigos.net/dicas/firebird-aprenda-a-usar-os-tipos-de-dados-date-time-e-timestamp-do-firebird-3252.html
[\code]
Caso não te ajudar, por favor, sinalizar para que possa ajudá-lo!
Abração e bons códigos!
Emanoel Deivison
Recife - PE
[code]
https://www.devmedia.com.br/data-e-hora-no-firebird/15161
[\code]
[code]
http://firebase.com.br/pipermail/lista_firebase.com.br/2004-October/001149.html
[\code]
[code]
http://www.activedelphi.com.br/forum/viewtopic.php?t=29166&sid=07395e0951b593b90085dd42bd98ab28
[\code]
[code]
http://comments.gmane.org/gmane.comp.db.firebase.portuguese/96022
[\code]
[code]
http://www.arquivodecodigos.net/dicas/firebird-aprenda-a-usar-os-tipos-de-dados-date-time-e-timestamp-do-firebird-3252.html
[\code]
Caso não te ajudar, por favor, sinalizar para que possa ajudá-lo!
Abração e bons códigos!
Emanoel Deivison
Recife - PE
GOSTEI 0
Deivison Melo
20/09/2014
Veja se os links abaixo te ajudará em sua empreitada:
Caso não te ajudar, por favor, sinalizar para que possa ajudá-lo!
Abração e bons códigos!
Emanoel Deivison
Recife - PE
http://firebase.com.br/pipermail/lista_firebase.com.br/2004-October/001149.html
http://www.activedelphi.com.br/forum/viewtopic.php?t=29166&sid=07395e0951b593b90085dd42bd98ab28
http://comments.gmane.org/gmane.comp.db.firebase.portuguese/96022
http://www.arquivodecodigos.net/dicas/firebird-aprenda-a-usar-os-tipos-de-dados-date-time-e-timestamp-do-firebird-3252.html
Caso não te ajudar, por favor, sinalizar para que possa ajudá-lo!
Abração e bons códigos!
Emanoel Deivison
Recife - PE
GOSTEI 0
Marlon Minotti
20/09/2014
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
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
GOSTEI 0
Deivison Melo
20/09/2014
Poste o seu código e detalhe ao máximo seu problema atual!
GOSTEI 0
Tone Costa.
20/09/2014
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
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
GOSTEI 0
Marlon Minotti
20/09/2014
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?
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?
GOSTEI 0
Tone Costa.
20/09/2014
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.
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.
GOSTEI 0
Marlon Minotti
20/09/2014
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.
Eu não sei.
GOSTEI 0
Marlon Minotti
20/09/2014
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.
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.
GOSTEI 0