Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
>
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 2Entendo 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.
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 2Veja se agora funciona.
>
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 2Veja 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.
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 2Mais uma vez, erro meu, kk.
>
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 2Mais 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.
Ufa, é errando que se aprende né?
Com certeza, sempre que eu puder, estarei disposto a ajudar.
>
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?
Cara, acho que DATE_FORMAT() retorna uma String, mas acho que é mais questão de desempenho mesmo.
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:
/applications/core/interface/imageproxy/imageproxy.php?img=http://imagizer.imageshack.us/v2/280x200q90/674/s2qBx2.jpg&key=c35cf9bf9d10a67f5259e5e318681af27a48e307f6f0d999b8f66fde329f8e7e" alt="s2qBx2.jpg" />
No entanto, são muitos registros para cada data em questão.
E aí, o que pode ser dessa vez?
GROUP BY teste
Ou então:
GROUP BY DATE(ace_acesso)
O resultado será o mesmo.
>
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?
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.
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.
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.
>
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.
Tenta assim:
SELECT ace_acesso, DATE( ace_acesso ) AS teste
FROM acessos
WHERE DATE(ace_acesso) >= DATE_SUB(
) # 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 )