Lady01 0 Denunciar post Postado Dezembro 26, 2013 Estou tentando criar uma consulta que me retorne o percentual semestral de produtos trocados,apresentando defeito, dada uma data. Estou conseguindo o percentual, mas não dentro do período de 6 meses, e sim de todas as datas cadastradas. Segue o código: SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito FROM TROCAJOIN (SELECT COUNT( * ) AS total FROM TROCA ) AS tWHERE DATE_ADD( '2013/12/25', INTERVAL -180DAY ) GROUP BY comDefeito Alguém pode dar uma luz? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 26, 2013 O teste de data tem de estar no sub que monta o total. Compartilhar este post Link para o post Compartilhar em outros sites
Lady01 0 Denunciar post Postado Dezembro 26, 2013 Motta, Segui a sua orientação, mas ele continua considerando todas as datas =/ Ficou assim: SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito FROM TROCAJOIN (SELECT COUNT( * ) AS total FROM TROCAWHERE DATE_ADD( '2013/12/25', INTERVAL -180 DAY )) AS t GROUP BY comDefeitoLIMIT 0 , 30 Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 26, 2013 tenta assim ... SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito FROM TROCA JOIN (SELECT COUNT( * ) AS totalFROM TROCA WHERE DATE_ADD( '2013/12/25', INTERVAL -180 DAY ) ) AS t WHERE DATE_ADD( '2013/12/25', INTERVAL -180 DAY ) GROUP BY comDefeito Compartilhar este post Link para o post Compartilhar em outros sites
Lady01 0 Denunciar post Postado Dezembro 26, 2013 Motta, Continua a mesma coisa, mas eu fiz um teste, dessa vez, puxando todos os registros de acordo com a condição da data e vi que não está obedecendo essa condição, traz todas as datas, veja como eu fiz: SELECT * FROM trocaWHERE DATE_ADD( '2013/12/22', INTERVAL -180DAY ) Você conhece outro jeito de montar essa condição de data? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Dezembro 26, 2013 Não conheço esta functions de data do MySql, presumi que a sua estava correta , apenas faltando na subquery. em vez de DATE_ADD( '2013/12/25', INTERVAL -180 DAY ) não seria ADDDATE(campo_data, INTERVAL 180 DAY) <= curdate() onde campo_data é a campo que tem a data de sua tabela ? Compartilhar este post Link para o post Compartilhar em outros sites
Lady01 0 Denunciar post Postado Dezembro 26, 2013 Motta, Usando assim dá erro de sintaxe. Acredito que eu não possa usar o campo data diretamente no mysql, pois eu vou pegar a data para consulta semestral através do formulário. Tô fazendo vários testes aqui e nada Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Dezembro 26, 2013 WHERE DATE_ADD( '2013/12/25', INTERVAL -180 DAY ) não sei se entendi bem, mas só lembrando: 1: o formato de data no MySQL seria 2013-12-25 (com traços, não barras); 2. se queremos adicionar dias a uma determinada data, pode-se usar tanto adddate() como date_add() (são sinônimos), assim não faz muito sentido o sinal de menos antes da quantidade de dias; 3. se queremos subtrair uma quantidade de dias a partir de uma determinada data, podemos usar date_sub; o exemplo abaixo exibe uma data 30 dias antes de 1 registro (uma noticia) inserida em 17/12/2013, às 16:09:19 (a coluna é "dia"): DATE_sub(dia, INTERVAL 30 DAY) from tbnoticias where idnotic=17 resultado: 2013-11-17 16:09:19 Compartilhar este post Link para o post Compartilhar em outros sites
Lady01 0 Denunciar post Postado Dezembro 26, 2013 Fernando, Tentei adaptar suas orientações a minha realidade, continua trazendo todos os registros, veja: SELECT dataFROM trocaWHERE DATE_SUB( '2013-12-25', INTERVAL 180 DAY ) LIMIT 0 , 30 Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Dezembro 26, 2013 a minha realidade olá.. veja bem, como eu disse, não sei se entedi bem, mas se não me engano, sua consulta recupera uma data especifica, e me parece que não é isso o q vc precisa.. (alias não é por nada não, mas eu pessoalmente prefiro evitar o uso da palavra "data" já que em ingles pode ser uma palavra reservada que corresponde a "dados") num intervalo muito específico, preciso (exatamente 180 dias)... então um registro fora dessa data não atende à consulta, percebe? uma sugestão: se vc quer recuperar uma faixa (vários registros) dentro de uma sequencia de tempo, tente usar between.. ou então diferença entre datas.. (datediff) adaptando o exemplo que passei acima, a seguinte consulta recupera todos os registros que tem até 60 dias: select * from tbnoticias where datediff(curdate(), dia) <= 60 Compartilhar este post Link para o post Compartilhar em outros sites
Fernando C 128 Denunciar post Postado Dezembro 26, 2013 complementando.. a consulta abaixo recupera noticias inseridas num período de um ano (365 dias)pelo autor "Fernando": select * from tbnoticias where datediff(curdate(), dia) <= 365 and autor='Fernando' veja se é por ai.. e caso eu n esteja explicando bem ou n seria nada disso foi mal, ta? Compartilhar este post Link para o post Compartilhar em outros sites
Lady01 0 Denunciar post Postado Dezembro 27, 2013 Pessoal, consegui resolver, depois de muito brigar rs Acontece que eu nunca tinha usado essas funções antes, e acabei fazendo a condição do where de forma errada, pois o ideal é usar between mesmo como o Fernando tinha falado. O resultado final ficou assim: SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito FROM TROCA JOIN (SELECT COUNT( * ) AS total FROM TROCA WHERE dataTroca BETWEEN DATE_SUB( '2013-12-27', INTERVAL 186 DAY ) AND '2013-12-27' ) AS t WHERE dataTroca BETWEEN DATE_SUB( '2013-12-27', INTERVAL 186 DAY ) AND '2013-12-27' GROUP BY comDefeito Eu mudei o nome do campo data, devido a orientação do Fernando, por "data" ser uma palavra reservada. E coloquei o intervalo como 186 dias, considerando meses com 31 dias. Eu fiz as contas do percentual na mão também, para me certificar de que está tudo certo. Agradeço ao Motta e ao Fernando pela atenção. Até a próxima. Compartilhar este post Link para o post Compartilhar em outros sites