Filtrar por data/hora em campos separados

Forum sobre SQL.

Moderador: Moderadores

gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Filtrar por data/hora em campos separados

Mensagem por gilbertosilverio »

Olá Amigos,

Com faço para trazer todos os registros entre um período e a partir de uma determinada hora.

Ja tentei de todas as maneiras, mais só retorna, no caso no próximo dia a partir da hora que determinei...

Código: Selecionar todos

SELECT * FROM portais.entraportal WHERE dt_fecha >= '2021-05-24' AND dt_fecha <=  '2021-05-31'
AND HR_FECHA >= '16:00' LIMIT 1000 

Grato.
Anexos
t1.png
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Filtrar por data/hora em campos separados

Mensagem por gilbertosilverio »

Ola amigos,

Creio que seja essa a solução, usando CONCAT(), caso exista outra, por favor me ensinem como fazer...

Código: Selecionar todos

SELECT * FROM portais.entraportal WHERE CONCAT( dt_fecha, hr_fecha ) >= '2021-05-2416:00' LIMIT 1000 
Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Filtrar por data/hora em campos separados

Mensagem por JoséQuintas »

Código: Selecionar todos

where dtfecha > '2021-05-21' or ( dtfecha = '2021-05-21' and hrfecha >= '16:00' )
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Filtrar por data/hora em campos separados

Mensagem por alxsts »

Olá!

Acho que o que falta na questão é uma definição do período, com data e hora de início e data e hora de fim. Teste aí:

Código: Selecionar todos

SELECT *
  FROM portais.entraportal
 WHERE TimeStamp( dt_fecha, hr_fecha)  BETWEEN TimeStamp('2021-05-24 16:00') AND TimeStamp('2021-05-31 23:59')
LIMIT 1000;
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Filtrar por data/hora em campos separados

Mensagem por alxsts »

Olá!

Outra opção:

Código: Selecionar todos

SELECT * 
  FROM portais.entraportal 
 WHERE CONCAT(dt_fecha, ' ', hr_fecha) BETWEEN '2021-05-24 16:00:00' AND '2021-05-31 23:59:59'
[]´s
Alexandre Santos (AlxSts)
gilbertosilverio
Usuário Nível 3
Usuário Nível 3
Mensagens: 339
Registrado em: 18 Jan 2009 10:39
Localização: Ribeirao Pires - SP

Filtrar por data/hora em campos separados

Mensagem por gilbertosilverio »

Olá amigos,

Quintas, Alexandre, obrigado pela ajuda.

Todas as formas retornam o que preciso, mais a que ficou mais funcional foi essa:

Código: Selecionar todos


SELECT * FROM portais.entraportal
WHERE CONCAT(dt_fecha, ' ', hr_fecha) BETWEEN '2021-05-24 16:00:00' AND '2021-05-31 23:59:59'
ORDER BY CONCAT (dt_fecha, ' ', hr_fecha)

Acrescentei ORDER BY CONCAT().

Outra duvida, devo usar o CONCAT() para "indexar" e filtrar campos para agilizar a pesquisa, quando necessário, ou somente usar ORDER BY com as colunas que desejo ordenar?

Grato.
GilbertoSilverio
gilbertosilverio@gmail.com
gilbertosilverio2003@yahoo.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Filtrar por data/hora em campos separados

Mensagem por JoséQuintas »

Essa é uma boa pergunta, porque fiquei na dúvida nesse uso.
Com certeza do outro jeito dá pra aproveitar o índice pra agilizar.
Já com o CONCAT() NÃO sei dizer se precisa fazer o cálculo com cada registro pra poder aplicar o filtro.
Só mesmo fazendo um teste prático pra tirar a dúvida sobre isso.
Se mesmo assim aproveitar o índice, com certeza fica bem mais prático usar a conversão.
E já ir se preparando pra usar o campo datetime.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Filtrar por data/hora em campos separados

Mensagem por alxsts »

Olá!
gilbertosilverio escreveu:Outra duvida, devo usar o CONCAT() para "indexar" e filtrar campos para agilizar a pesquisa
Não. Diferentemente do sistema DBF, o MySQL não permite usar funções nas expressões de criação de índices.
JoséQuintas escreveu:Já com o CONCAT() NÃO sei dizer se precisa fazer o cálculo com cada registro pra poder aplicar o filtro.
Sim. A função é chamada para cada linha.
JoséQuintas escreveu:Se mesmo assim aproveitar o índice, com certeza fica bem mais prático usar a conversão.
Não testei mas provavelmente não vai usar índice por causa do Concat().

Nota sobre a função Concat():
se uma das expressões a serem concatenadas contiver o valor NULL, o resultado final será NULL.

Código: Selecionar todos

select concat( 'Forum ', 'Clipper ', 'on ', 'Line')   --> Forum Clipper on Line
select concat( 'Forum ', 'Clipper ', null , 'Line')   --> null
Para contornar isto, utilize a função Concat_WS() (WS = With Separator)

Código: Selecionar todos

select concat_ws( ' ', 'Forum', 'Clipper', 'on', 'Line')   --> Forum Clipper on Line
select concat_ws( ' ', 'Forum', 'Clipper', null , 'Line') --> Forum Clipper Line
O primeiro argumento é o separador. Se o separador for NULL, o resultado será NULL.
gilbertosilverio escreveu:Todas as formas retornam o que preciso, mais a que ficou mais funcional foi essa:
Portanto, se na tua tabela existirem valores NULL nas colunas envolvidas no Concat(), troque por Concat_WS().
[]´s
Alexandre Santos (AlxSts)
Responder