DICAS

Visite a biblioteca de dicas da comunidade.

Saiba mais

ARTIGOS

Abordagens detalhadas sobre assuntos diversos.

Saiba mais

INICIANTES

Aprenda a programar de um modo simples e fácil.

Saiba mais

DOWNLOADS

Acesse os materiais exclusivos aos membros.

Saiba mais
voltar

PARA QUEM GOSTA DE DELPHI

Função Interna do Firebird Time_Between para obter a diferença entre duas horas – SQL Firebird

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!

Facebook Comments Box
  • Giovani Da Cruz
  • 5.474 views
  • 5 comentários
  • 27 de março de 2020

Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!

5 respostas para “Função Interna do Firebird Time_Between para obter a diferença entre duas horas – SQL Firebird”

  1. Ailton disse:

    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.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      
      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;
       
          Exit;
        end;
       
        FrmPrincipal.FDQuery1Users.SQL.Clear;
        FrmPrincipal.FDQuery1Users.SQL.Add(' Select TABLogin.Usuario, TABLogin.Senha ');
        FrmPrincipal.FDQuery1Users.SQL.Add(' From TABLogin ' );
        FrmPrincipal.FDQuery1Users.SQL.Add(' where TABLogin.Usuario = ' + QuotedStr(Edit1.Text));
        FrmPrincipal.FDQuery1Users.SQL.Add(' where TABLogin.Senha = ' + QuotedStr(Edit2.Text));
        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;
  2. Gerson De Simone disse:

    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

  3. Obrigado pelo comentário Gerson, ajustado.

  4. jferrareze disse:

    Gostaria de saber se você tem essa Função Interna do Firebird Time_Between para o firebird 2.5.9

Deixe um comentário

Ir ao topo

© 2024 Infus Soluções em Tecnologia - Todos os Direitos Reservados