Ir para conteúdo

Arquivado

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

Matheus Rennê

[Resolvido] Próximos aniversariantes

Recommended Posts

Salve galera,

 

Preciso fazer uma busca no DB onde ele me retorna os próximos 15 aniversáriantes.

Já procurei no Google e no fórum, até achei esse código do Micox:

 

SELECT algo FROM nome_tabela WHERE TO_DAYS(data_niver) - TO_DAYS(NOW()) <= 7;

mas não resolveu meu problema. Ela me retorna todos os registros. Inclusive as datas anteriores ao dia de hoje.

 

O tipo do campo no MySQL está como DATE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

TO_DAYS vai converter para um número de dias, mas leverá em consideração o ano. Como o ano corrente é diferente do ano de nascimento do usuário, vai dar errado.

 

Você tem de usar o dia e o mês do aniversário. Use MONTH() e DAY()

 

http://dev.mysql.com/doc/refman/5.1/en/dat...-functions.html

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo,

 

Se eu usar MONTH() e DAY(), não vou conseguir o resultado que eu quero.

Veja o select

 

SELECT * FROM tabela WHERE MONTH(data) >= MONTH(NOW()) AND TO_DAYS(data) - TO_DAYS(NOW()) <= 7 ORDER BY data ASC

Se eu usar dessa forma, ele me retorna todos os registros.

Compartilhar este post


Link para o post
Compartilhar em outros sites

?????????

 

Salve galera,

 

Preciso fazer uma busca no DB onde ele me retorna os próximos 15 aniversáriantes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, preciso listar os próximos 15 aniversários.

 

Mas isso teria que ser dentro do WHERE, uma vez que uso LIMIT pra fazer a paginação.

 

EDIT: Pode ser usando LIMIT, ai eu retiro a paginação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se quiser listar somente 15, terá de usar LIMIT. Faça outro SELECT, se for necessário, até porque não faz sentido uma paginação listar aniversariantes.

 

Qual é a estrutura de sua tabela e como você armazena os dados nela?

Compartilhar este post


Link para o post
Compartilhar em outros sites

use o mes e o dia mas faça um calculo

 

WHERE (MONTH(data) * 100 +  DAY(data)) >= (MONTH(NOW()) * 100 + DAY(NOW()))

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo,

 

Precisava fazer a paginação, pois não é apenas uma lista de aniversariantes.

São boxes contendo o avatar, nome, data e quantas mensagens a pessoa já recebeu.

 

 

giesta e Mário Monteiro,

 

Era isso que eu queria, fazer o cálculo dentro do where.

 

 

Mário Monteiro,

 

Já tinha visto esse código seu em outro tópico e me lembro de você ter dito que não funciona sempre.

 

 

Mas enfim, resolvi tirar a paginação e colocar o LIMIT.

Minha consulta ficou dessa forma:

 

SELECT * FROM tabela WHERE MONTH(data) >= MONTH(NOW()) AND DAY(data) >= DAY(NOW()) ORDER BY MONTH(data) ASC, DAY(data) ASC LIMIT 15

Agradeço a ajuda de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

disse que nao funciona?

 

deve ter algum motivo para isso mas na regra funciona sim

 

mas que bom qeu considerou resolvido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mário, se o dia for 31 e o mês for 12 ele retorna somente os aniversariantes de 31/12, quando deveria também retornar os aniversariantes de 01/01.

 

Pessoal, também estou precisando desse código de "próximos aniversariantes". Alguém tem um que funcione para todas as ocasiões?

Compartilhar este post


Link para o post
Compartilhar em outros sites

quando precisei de algo assim e nao consegui bolar um sql que funcionasse completamente nao perdi muito tempo e fiz uma POG rapida

 

exemplo

 

precisa de 10 registros faça

 

SELECT * FROM tabela WHERE (MONTH(data) * 100 +  DAY(data)) >= (MONTH(NOW()) * 100 + DAY(NOW())) ORDER BY MONTH(data), DAY(data) LIMIT 10

verifica quantos registros foram retornados

 

se forem os 10 acabou o problema

 

senao faz outro select mais geral logo abaixo que é este caso que citou e seleciona o que falta para completar os 10 registros

 

basta tirar o where e alterar o numero de retornos

 

SELECT * FROM tabela ORDER BY MONTH(data), DAY(data) LIMIT (10-RegistrosEncontrados)

nao sei se serve para voce mas fiz assim para nao perder muito tempo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Que bom entao

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso de mysql acredito que o seguinte codigo funcione

 

SELECT * FROM `clientes` WHERE MONTH(niver) > MONTH(now()) order by MONTH(niver)asc, DAY(niver)asc limit 0,10

 

O codigo acima funciona para aniversarios com mes acima da data atual, ou seja, caso seja mes 7 irá até mes 12. Para aniversarios no proximo ano, o codigo muda para

 

SELECT * FROM `clientes` WHERE MONTH(niver) < MONTH(now()) order by MONTH(niver)asc, DAY(niver)asc limit 0,10

 

se no primeiro caso o seu limite de paginação nao for atingido realize a segunda busca para complementar

 

acho que assim funciona.. não testei ainda .. quem testar fala ae ...

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.