



Fala galera do Show Delphi, tudo beleza?
Nestes dias de quarentena estava aqui brincando com alguns códigos e estava testando o calculo para descobrir a diferença entre dois horários, o que aparentemente parece muito simples, mas apanhei um pouco para fazer.
Agora já simplifiquei tudo e gostaria de partilhar com vocês uma forma que resolveu o meu problema.
Bem, vamos a situação hipotética:
Descobrir quanto tempo existe entre 01:30 e 04:50.
Em princípio o que vem em nossa cabeça é o seguinte:
1 2 3 | SELECT CAST('04:50:00' AS TIME) - CAST('01:30:00' AS TIME) FROM RDB$DATABASE |
parece óbvio, mas o resultado aqui é 12.000, que provavelmente são os segundos entre os dois horários!
Certo, mas eu preciso no formado Time, como fazer?
Bem, encontrei uma forma bem interessante, funciona mas dá um trabalhinho, rsrsrs.
1 2 3 4 5 | SELECT DATEADD(HOUR, - EXTRACT(HOUR FROM CAST('01:30:00' AS TIME)), DATEADD(MINUTE, - EXTRACT(MINUTE FROM CAST('01:30:00' AS TIME)), DATEADD(SECOND, - EXTRACT(SECOND FROM CAST('01:30:00' AS TIME)), CAST('04:50:00' AS TIME) ))) AS tempo_total FROM RDB$DATABASE |
Já pensando em produtividade, resolvi encapsular este SQL em uma função interna para agilizar o trabalho!
Segue o código da função:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | SET TERM ^ ; CREATE OR ALTER FUNCTION TIME_BETWEEN ( IN_HOUR_START TIME, IN_HOUR_END TIME) RETURNS TIME AS DECLARE variable VRETURN TIME; BEGIN SELECT DATEADD(HOUR, - EXTRACT(HOUR FROM CAST(:in_hour_start AS TIME)), DATEADD(MINUTE, - EXTRACT(MINUTE FROM CAST(:in_hour_start AS TIME)), DATEADD(SECOND, - EXTRACT(SECOND FROM CAST(:in_hour_start AS TIME)), :in_hour_end))) FROM RDB$DATABASE INTO :vreturn; RETURN vreturn; END ^ SET TERM ; ^ |
Por fim, veja como esta função internal realmente simplifica a vida para novas consultas!
1 2 3 4 5 | SELECT time_between(CAST('01:30:00' AS TIME), CAST('04:50:00' AS TIME)) AS TEMPO_TOTAL, time_between(CAST('03:10:50' AS TIME), CAST('14:08:15' AS TIME)) AS TEMPO_TOTAL2, time_between(CAST('23:00:00' AS TIME), CAST('01:00:00' AS TIME)) AS TEMPO_TOTAL3 FROM RDB$DATABASE |
Para facilitar o entendimento, criei uma vídeo aula explicando o método:
Certo pessoal! Dúvidas deixem o seu comentário.
Um abraço e até a próxima. Valeu!
Você precisa fazer o login para publicar um comentário.
Parabéns, muito bom!
Você pode me ajudar a criar uma tela de Login? Criei as Table no IBExpert e estou usando os componentes FireDAC (FDConnection e FDQuery). Não consigo fazer o código correto.
procedure TFrmLogin.BitBtn2Click(Sender: TObject);
begin
if (Edit1.Text = ”) or (Edit2.Text = ”) then
begin
Application.MessageBox(‘Usuário e/ou Senha não Informado(s). Tente novamente!’, ‘Controle da Granja’, mb_iconinformation + mb_ok);
Edit1.SetFocus;
end;
FrmPrincipal.FDQuery1Users.SQL.Add(‘Select Usuario.TABLogin, Senha.TabLogin’);
FrmPrincipal.FDQuery1Users.SQL.Add(‘From Usuario inner join usuario on usuario.TabLogin = usuario.Tablogin’);
FrmPrincipal.FDQuery1Users.SQL.Add(‘Select Senha From TABLogin’);
FrmPrincipal.FDQuery1Users.SQL.Add(‘From Senha inner join senha on senha.TabLogin = senha.Tablogin’);
FrmPrincipal.FDQuery1Users.SQL.Clear;
FrmPrincipal.FDQuery1Users.Open;
if FrmPrincipal.FDQuery1Users.RecordCount>0 then
begin
FrmPrincipal := TFrmPrincipal.Create(Self);
try
FrmPrincipal.ShowModal;
finally
FrmPrincipal.Free;
end;
end
else
begin
Application.MessageBox(‘Reveja suas Credenciais. Acesso Negado!’, ‘Controle da Granja’, mb_iconinformation + mb_ok);
end;
end;
Talvez Aiton seja melhor rever o seu SQL.
Tentei imaginar uma forma de fazer para você, adaptando um pouco o seu código, teste para ver se funciona.
Boa solução a que foi apresentada, só orientando o Ailton, se é que me permite, ele colocou o comando SQL.clear depois de adicionar os comandos SQL, o comando SQL.Clear sempre tem que ser usado antes de adicionar os novos comandos, eu ainda gosto de colocar o comando SQL.Prepare antes do SQL.Open.
Quanto ao código SQL do Ailton me parece errado, quanto ao sugerido me parece bom mas só uma ressalva, na segunda linha está ‘ From TABLogin TABLogin’, não deveria ser só ‘ From TABLogin’, obrigado pela atenção
Obrigado pelo comentário Gerson, ajustado.
Gostaria de saber se você tem essa Função Interna do Firebird Time_Between para o firebird 2.5.9