



Fala galera de Delphi, tudo beleza?
Hoje vamos ver uma dica de SQL, muito útil no nosso dia a dia.
Há casos que estamos montando nossa consulta, procedure ou trigger e precisamos alterar o valor de um campo timestmp, mais precisamente adicionar ou remover horas.
a primeira coisa que vem a cabeça, seria algo assim
1 2 3 4 | -- para remover uma hora, normalmente pensamos assim, mas isso remove um dia. SELECT CURRENT_TIMESTAMP - 1 FROM rdb$database r |
Como colocado no comentário, o sql acima remove um dia.
Ai então, usando a lógica, podemos chegar a seguinte conclusão:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | -- adiciona 12 horas. SELECT CURRENT_TIMESTAMP + 0.5 FROM rdb$database r -- remove 6 horas. SELECT CURRENT_TIMESTAMP - 0.25 FROM rdb$database r -- adiciona 3 horas. SELECT CURRENT_TIMESTAMP + 0.125 FROM rdb$database r --... |
Até funciona, ir tentando calcular para achar o valor correspondente
1 – 24 horas
0.5 – 12 horas
0.25 – 6 horas
…
Porém é fácil de cometermos enganos e fica difícil a leitura para outra pessoa que venha a ler os comandos.
Então, pesquisando encontrei a seguinte UDF que já vem como padrão na instalação do firebird.
ADDHOUR
Como o próprio nome sugere, com ela podemos facilmente incluir horas e inclusive vamos utilizar ela para remover horas. Vamos aos exemplos:
Para utiliza-la de modo geral é addhour(valor_time_stamp, horas).
1 2 3 4 5 6 7 8 9 | -- adicionando 3 horas. SELECT addhour( CURRENT_TIMESTAMP, 3 ) FROM rdb$database r -- removendo uma hora SELECT addhour( CURRENT_TIMESTAMP, -1 ) FROM rdb$database r |
O segredo para diminuir horas foi passar o parâmetro negativo.
Existem outras UDFs nativas da instalação que server para adicionar e remover minutos, segundos, dias e etc. Mas a abordagem ficará para um próximo post.
As Consultas SQL foram testadas no Firebird 3.0.
Esperam que tenham gostado pessoal.
Dúvidas ou sugestões? Deixe o seu comentário!
Bons códigos e até a próxima. Valeu!
Você precisa fazer o login para publicar um comentário.
Recordo ter lido algo sobre a incompatibilidade do FB3.0.. com a rfunc.dll e as duas funções acima se estou bem lembrado fazem parte dessa lib, logo, não funcionam mais com o FB3
Olá @mario, testei aqui na minha máquina com o Firebird 3.0.5 e a princípio funcionou perfeitamente.
Talvez só esteja faltando declarar a UDF no banco. Tente rodar este script: