Consulta entre duas datas e horarios
13/12/2024
0
Ricardo
Posts
13/12/2024
Arthur Heinrich
DATE - Armazena apenas a data
TIME - Armazena apenas o horário
TIMESTAMP - Armazena data e hora
Como você está especificando DATA e HORA, imagino que tenha criado as colunas com o tipo timestamp.
Outro aspecto a se considerar é que, em diferentes países, o formato de data muda.
Por exemplo, a data 10/12/2024 pode ser formatada de diferentes formas:
No Brasil, 10/12/2024 (dd/mm/yyyy)
Nos EUA, 12/10/2024 (mm/dd/yyyy)
No Japão, 2024-12-10 (yyyy-mm-dd)
O Firebird, ao converter um texto em data, precisa pressupor o formato que está sendo utilizado e, utiliza por convenção, os seguintes formatos:
dd.mm.yyyy -> 10.12.2024
mm/dd/yyyy -> 12/10/2024
yyyy mm dd -> 2024 12 10
yyyy-mm-dd -> 2024-12-10
yyyy.mm.dd -> 2024.12.10
yyyy/mm/dd -> 2024/12/10
Se você utilizar a data no formato '13/04/2024 22:00', o banco entenderá 04/13/2024, apresentando erro por não existir o mês 13.
Para transformar o texto '13/04/2024 22:00' corretamente para o dia 13/04/2024 às 22:00hs, é necessário substituir as barras "/" por pontos "." e então converter o datatype para timestamp.
cast( replace('13/04/2024 22:00', '/', '.') as timestamp)
Exemplo de como retornar os pedidos efetuados entre 13/04/2024 as 22:00 até 14/04/2024 as 05:00
select id_pedido, data_pedido, valor from pedidos where data_pedido between cast( replace('13/04/2024 22:00', '/', '.') as timestamp) and cast( replace('14/04/2024 05:00', '/', '.') as timestamp)
14/12/2024
Ricardo
DATE - Armazena apenas a data
TIME - Armazena apenas o horário
TIMESTAMP - Armazena data e hora
Como você está especificando DATA e HORA, imagino que tenha criado as colunas com o tipo timestamp.
Outro aspecto a se considerar é que, em diferentes países, o formato de data muda.
Por exemplo, a data 10/12/2024 pode ser formatada de diferentes formas:
No Brasil, 10/12/2024 (dd/mm/yyyy)
Nos EUA, 12/10/2024 (mm/dd/yyyy)
No Japão, 2024-12-10 (yyyy-mm-dd)
O Firebird, ao converter um texto em data, precisa pressupor o formato que está sendo utilizado e, utiliza por convenção, os seguintes formatos:
dd.mm.yyyy -> 10.12.2024
mm/dd/yyyy -> 12/10/2024
yyyy mm dd -> 2024 12 10
yyyy-mm-dd -> 2024-12-10
yyyy.mm.dd -> 2024.12.10
yyyy/mm/dd -> 2024/12/10
Se você utilizar a data no formato '13/04/2024 22:00', o banco entenderá 04/13/2024, apresentando erro por não existir o mês 13.
Para transformar o texto '13/04/2024 22:00' corretamente para o dia 13/04/2024 às 22:00hs, é necessário substituir as barras "/" por pontos "." e então converter o datatype para timestamp.
cast( replace('13/04/2024 22:00', '/', '.') as timestamp)
Exemplo de como retornar os pedidos efetuados entre 13/04/2024 as 22:00 até 14/04/2024 as 05:00
select id_pedido, data_pedido, valor from pedidos where data_pedido between cast( replace('13/04/2024 22:00', '/', '.') as timestamp) and cast( replace('14/04/2024 05:00', '/', '.') as timestamp)
boa tarde Arthur, uma situacao é que alimento meus campos com o tipo Date e Time na tabela e estou tentando colocar a funcao que voce indica porem sem sucesso, veja
Qr_Vendas.SQL.Text := 'SELECT * FROM VENDAS WHERE DATA between cast( replace('+v_Data_Inicial v_Hora_Inicial+'', '/', '.') as timestamp) and cast( replace('14/04/2024 05:00', '/', '.') as timestamp)';
desta forma esta retornando (309): Missing operator or semicolon e nao estou conseguindo entender onde esta o erro
15/12/2024
Arthur Heinrich
Existem 2 problemas ao se fazer isso:
1 - Dependendo da situação, onde o que vai ser concatenado vem de um input do usuário, pode ocorrer uma falha chamada SQL injection.
2 - Quando se concatena strings, precisamos diferenciar as aspas simples que delimitam a string, das aspas simples que fazem parte do conteúdo.
Da forma como você concatenou: between cast( replace(' + v_Data_Inicial + v_Hora_Inicial + ', '/', '.') as timestamp)
O resultado seria: between cast( replace(13/04/202422:00, '/', '.') as timestamp), acarretando erro de sintaxe.
O resultado precisa trazer a data e hora separados por um espaço e entre aspas simples, no conteúdo, para representar um literal.
O correto seria: between cast( replace(''' + v_Data_Inicial + ' ' + v_Hora_Inicial + ''', '/', '.') as timestamp)
Veja que, antes da variável ser concatenada, a primeira parte da string termina com 3 aspas simples. As primeiras duas introduzem uma aspas simples no conteúdo, delimitando a data e hora que serão concatenadas. O mesmo ocorre no final.
Também concatenei um espaço em branco.
Porém, o ideal seria trabalhar com bind variables. Assim, sua query sempre será a mesma para o banco, resolvendo outro problema de performance, já que concatenando as datas e horários, o seu programa vai gerar muitas queries distintas, forçando o hard parse toda vez que a query for executada.
Clique aqui para fazer login e interagir na Comunidade :)