Consulta entre duas datas e horarios

Delphi

13/12/2024

bom dia, como posso fazer um select com query entre duas datas e horarios, algo assim do dia 13/04/2024 as 22:00 ate 14/04/2024 as 05:00, no caso uso D7 com firebird
Ricardo

Ricardo

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

13/12/2024

O Firebird possui 3 datatypes distintos para manipular datas e horários:

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)


GOSTEI 0
Ricardo

Ricardo

13/12/2024

O Firebird possui 3 datatypes distintos para manipular datas e horários:

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
GOSTEI 0
Arthur Heinrich

Arthur Heinrich

13/12/2024

Você está concatenando a data e hora. separadas, na query.

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.
GOSTEI 0
POSTAR