cadmiel 0 Denunciar post Postado Agosto 19, 2014 E aí galerinha...blz gostaria de um help o que está errado na minha condição sql where concat_ws('-',year(now()),month(colaborador_data_nascimento),day(colaborador_data_nascimento))<=DATE_ADD(NOW(),INTERVAL 30 DAY) order by colaborador_data_nascimento asc Essa instrução precisa me retornar todos os colaboradores que farão aniversário nos próximos 30 dias ou num intervalo de 30 dias. O que está errado no meu sql ? vlw Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 20, 2014 Formate todas as datas como MMDD (mês/dia) e compare usando between. Compartilhar este post Link para o post Compartilhar em outros sites
cadmiel 0 Denunciar post Postado Agosto 20, 2014 Tentei desse geito where DATE_FORMAT(colaborador_data_nascimento,'%m/%d') BETWEEN '08/20' AND '9/19' e tb não deu certo. Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Agosto 20, 2014 É porque a função CONCAT_WS() retorna um tipo String e não Date, portanto podemos utilizar a função DATE() para converter o resultado para o tipo correto e, enfim, aplicar o filtro. Ao filtrar desta forma ("<= DATE_ADD(NOW(),INTERVAL 30 DAY)"), você está filtrando inclusive, quem já fez aniversário, a sugestão do @Motta foi utilizar o BETWEEN para filtrar ENTRE duas datas, no caso de hoje até daqui 30 dias, por exemplo: WHERE DATE( CONCAT_WS( '-', YEAR( CURDATE() ), MONTH( colaborador_data_nascimento ), DAY( colaborador_data_nascimento ) ) BETWEEN CURDATE() AND DATE_ADD( CURDATE(), INTERVAL 30 DAY ) Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Agosto 20, 2014 Mas para isto os dois lados do where tem de estar no mesmo formato , mês e dia no formato MMDD , assim quem faz aniversario em 1/jfev vem 02/01 senão o between não funciona , o outro detalhe , em uma virada de ano não funcionaria se deveria fazer duas condicões between 12/15 and 01/12 --nao between 12/15 and 12/31 and between 01/01 and 01/12 --sim Compartilhar este post Link para o post Compartilhar em outros sites
lokaodomau 61 Denunciar post Postado Agosto 20, 2014 Outra solução: WHERE DAYOFYEAR( colaborador_data_nascimento ) BETWEEN DAYOFYEAR( CURDATE() ) AND DAYOFYEAR( ADDDATE(CURDATE(), INTERVAL 30 DAY) ) Compartilhar este post Link para o post Compartilhar em outros sites
paulojuchem 20 Denunciar post Postado Agosto 22, 2014 WHERE( DATE(CONCAT(DATE_FORMAT(CURRENT_DATE,'%Y'),DATE_FORMAT(colaborador_data_nascimento,'-%m-%d'))) <= DATE_ADD(CURRENT_DATE,INTERVAL 1 MONTH))AND( DATE(CONCAT(DATE_FORMAT(CURRENT_DATE,'%Y'),DATE_FORMAT(colaborador_data_nascimento,'-%m-%d'))) > CURRENT_DATE) testa ae, n deu para replicar Compartilhar este post Link para o post Compartilhar em outros sites