Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Aprendiz/CE

Aonde estou errando?

Recommended Posts

Prezados,

 

Aonde está o erro nessa minha instrução SQL?.

 

SQL:

 

SELECT ace_acesso, DATE_FORMAT(DATE_SUB( (SELECT MAX(ace_acesso) FROM acessos), INTERVAL 2 DAY), '%Y-%m-%d') as teste FROM acessos
WHERE DATE_FORMAT(ace_acesso, '%Y-m-%d') >= DATE_FORMAT(DATE_SUB( (SELECT MAX(ace_acesso) FROM acessos), INTERVAL 2 DAY), '%Y-%m-%d') ORDER BY ace_acesso DESC

 

Quero que a mesma sempre me retorne o movimento dos dois últimos dias conforme a sua data de registro (coluna ace_acesso - DATETIME). O "DATE_SUB" está funcionando, pois retorna a data certa mediante a data "passada". O problema é que o "WHERE" não filtra de forma alguma. Só para constar: A coluna "teste" é usada só para efeito de verificação.

 

 

Grato a todos e aguardo qualquer orientação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
  ( SELECT MAX(ace_acesso) AS max_ace FROM acessos ) # DATE_SUB @param 1
  , INTERVAL 2 DAY# DATE_SUB @param 2
) # fim DATE_SUB
GROUP BY ace_acesso
ORDER BY ace_acesso DESC

Entendo que o campo `ace_acesso` é do tipo DATE, caso não seja, basta converter desta forma: DATE( ace_acesso )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
  ( SELECT MAX(ace_acesso) AS max_ace FROM acessos ) # DATE_SUB @param 1
  , INTERVAL 2 DAY# DATE_SUB @param 2
) # fim DATE_SUB
GROUP BY ace_acesso
ORDER BY ace_acesso DESC

Entendo que o campo `ace_acesso` é do tipo DATE, caso não seja, basta converter desta forma: DATE( ace_acesso )

 

Olá,

 

Só pra constar: A coluna é do tipo DATETIME, mas quero selecionar somente por DATA.. O DATE_FORMAT que estou utilizando está errado?

 

Vou e adiantando aqui e testando as suas recomendações.

 

Olá,

 

Só pra constar: A coluna é do tipo DATETIME, mas quero selecionar somente por DATA.. O DATE_FORMAT que estou utilizando está errado?

 

Vou e adiantando aqui e testando as suas recomendações.

Não deu certo!

 

Necessito pegar um, dois, três... dia(s) de movimentos conforme o parâmetro (número de dia(s)) passado. A data inicial de referencia sempre será a MAIOR DATA QUE CONSTA REGISTRO, daí devo deduzir o número de dias desejado e exibir todos os registros entre essa DATA INICIAL e a DATA FINAL encontrada.

 

Grato pela sua atenção e aguardo suas orientações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que eu esqueci de um detalhe para funcionar, segue corrigido:

SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
  DATE( SELECT MAX(ace_acesso) AS max_ace FROM acessos ) # DATE_SUB @param 1
  , INTERVAL 2 DAY# DATE_SUB @param 2
) # fim DATE_SUB
GROUP BY ace_acesso
ORDER BY ace_acesso DESC

Veja se agora funciona.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que eu esqueci de um detalhe para funcionar, segue corrigido:

 

SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
  DATE( SELECT MAX(ace_acesso) AS max_ace FROM acessos ) # DATE_SUB @param 1
  , INTERVAL 2 DAY# DATE_SUB @param 2
) # fim DATE_SUB
GROUP BY ace_acesso
ORDER BY ace_acesso DESC

Veja se agora funciona.

 

Executei sem alterar nada, mas deu erro. Segue:

 

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT MAX(ace_acesso) AS max_ace FROM acessos ) # DATE_SUB @param 1 , INTERVA' at line 4

 

Grato pela sua pronta atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
  ( SELECT DATE(MAX(ace_acesso)) AS max_ace FROM acessos ) # DATE_SUB @param 1
  , INTERVAL 2 DAY# DATE_SUB @param 2
) # fim DATE_SUB
GROUP BY ace_acesso
ORDER BY ace_acesso DESC

Mais uma vez, erro meu, kk.

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
  ( SELECT DATE(MAX(ace_acesso)) AS max_ace FROM acessos ) # DATE_SUB @param 1
  , INTERVAL 2 DAY# DATE_SUB @param 2
) # fim DATE_SUB
GROUP BY ace_acesso
ORDER BY ace_acesso DESC

Mais uma vez, erro meu, kk.

 

 

Bobagem. Isso é coisa que acontece. (rs)

 

Bem, me parece que agora o ilustre e comprometido amigo acertou na sua valiosa ajuda para comigo.

 

Testei a instrução SQL recomendada e aparentemente o resultado foi o que realmente necessito.

 

Vou por em produção, acompanhar e em caso de erros volto aqui e espero puder contar com a sua atenção novamente.

 

Muitíssimo obrigado e um forte abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ufa, é errando que se aprende né?

 

Com certeza, sempre que eu puder, estarei disposto a ajudar.

 

É sim! (rs)

 

Só mais uma coisa:

 

Você não me respondeu sobre o uso das funções DATE e DATE_FORMAT. Faz diferença se eu usar uma ou outra?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, acho que DATE_FORMAT() retorna uma String, mas acho que é mais questão de desempenho mesmo.

 

Entendido.

 

Penso que o seu jeito de fazer esteja mais correto. Lembrando que a coluna é do tipo DATETIME e necessito recuperar somente a parte da DATA.

 

Mais uma vez obrigado pela sua atenção.

 

 

Entendido.

 

Penso que o seu jeito de fazer esteja mais correto. Lembrando que a coluna é do tipo DATETIME e necessito recuperar somente a parte da DATA.

 

Mais uma vez obrigado pela sua atenção.

 

 

Me desculpa, mas não deu certo não.

 

Não mudei nada na instrução e observação melhor vi que a mesma não retorna todos dos registros devidos.

 

Retorno:

 

s2qBx2.jpg

 

No entanto, são muitos registros para cada data em questão.

 

E aí, o que pode ser dessa vez?

Compartilhar este post


Link para o post
Compartilhar em outros sites
GROUP BY teste

Ou então:

GROUP BY DATE(ace_acesso)

O resultado será o mesmo.

 

 

Fiz mas ficou na mesma. Até diminuiu ainda mais o número de registros.

 

Desculpa a minha ausência de conhecimento (para não falar burrice (rs)), mas esse "GROUP BY" é realmente necessário?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, acho que esta é a chave final, o GROUP BY agrupa por resultado, GROUP BY DATE( ace_acesso ) não deixaria as datas repetirem, caso deseja que todos os registros sejam exibidos, deverá remover o GROUP BY da SQL.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente, acho que esta é a chave final, o GROUP BY agrupa por resultado, GROUP BY DATE( ace_acesso ) não deixaria as datas repetirem, caso deseja que todos os registros sejam exibidos, deverá remover o GROUP BY da SQL.

 

Eu já havia feito isso, mas deu na mesma.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Necessito pegar um, dois, três... ace_acesso(s) de movimentos conforme o parâmetro (número de ace_acesso(s)) passado. A data inicial de referencia sempre será a MAIOR DATA QUE CONSTA REGISTRO, daí devo deduzir o número de ace_acessos desejado e exibir todos os registros entre essa DATA INICIAL e a DATA FINAL encontrada.

 

se entendi bem e ainda não resolveu, já tentou c/ subconsultas?

ex:

select * from acessos where date(ace_acesso)
between
(select date(date_sub(max(ace_acesso), interval XX day)) from acessos)
and
(select date(max(ace_acesso)) from acessos);

obs: onde está "XX" substitua pelo nº de dias desejado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

se entendi bem e ainda não resolveu, já tentou c/ subconsultas?

ex:

select * from acessos where date(ace_acesso)
between
(select date(date_sub(max(ace_acesso), interval XX day)) from acessos)
and
(select date(max(ace_acesso)) from acessos);

obs: onde está "XX" substitua pelo nº de dias desejado.

 

Olá Fernando,

 

Na realidade eu comecei utilizando o "BETWEEN", mas como só um parâmetro data resolveria o meu problema, implementei a instrução SQL postada por mim que na qual deu erro e resolvi pedir ajuda.

 

Sobre a instrução SQL, coloquei a mesma em produção fazendo uns ajustes necessários e aparentemente está funcionando legal.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.