Ir para conteúdo
Fórum Script Brasil
  • 0

Consulta - Retornar Aniversáriantes da segunda feira da atual semana


Negresco_7

Pergunta

select nome, nascimento from funcionario

where dayofweek(nascimento) = 2 and weekofyear(now()) = weekofyear(nascimento)

order by

year(nascimento) asc,

month(nascimento) asc,

day(nascimento) asc

com esse codigo eu acho os que nasceram na segunda feira da atual semana, mas preciso achar quem faz aniversário e não somente quem nasce.

Meu codigo da errado porque weekofyear(now()) = weekofyear(nascimento), vai dar valores diferentes, tem um cara q nasceu dia 31-08-1975 (no caso fez aniversario an segunda dessa semana), só que em 1975 dia 31/08 foi na 35º semana do ano e em 2009 é na 36º

Editado por Negresco_7
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Oi 'Negresco_7'

Os dados são de minha base de testes.

Como hoje é quarta feira, para efeito de teste usei o dia de hoje. Veja o exemplo e se este se aplica ao que você quer:

select nasceu from cliente where dayofweek(nasceu) = 4 and dayofweek(now()) = 4 and day(nasceu) = day(now()) and month(nasceu) = month(now())

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, não da certo pois você está comparando o dia que nasceu com o dia de hoje usando o now(), tem q comparar a data que nasceu com a data do 2º dia da semana (4º no caso ai)

no caso 2º dia desse samana seria 31/08

day(nascimento) = day(now())

31/08 = 02/09(hoje)

and month(nascimento) = month(now())

08 = 09

os 2 testei retornam, teria q comparar a data do nascimento com a data da segunda feira ( no caso dessa semana, foi 31/08/09)

Link para o comentário
Compartilhar em outros sites

  • 0

Olá.

Veja o seguinte exemplo:

select if(dayofweek(now())=1, "domingo",
       if(dayofweek(now())=2, "segunda",
       if(dayofweek(now())=3, "terça",
       if(dayofweek(now())=4, "quarta",
       if(dayofweek(now())=5, "quinta",
       if(dayofweek(now())=6, "sexta", "sábado")))))) as dia_de_hoje, date(now()) as hoje_eh,
       if(dayofweek(now())=1, +1,
       if(dayofweek(now())=2, +0,
       if(dayofweek(now())=3, -1,
       if(dayofweek(now())=4, -2,
       if(dayofweek(now())=5, -3,
       if(dayofweek(now())=6, -4, -5)))))) as dias_menos,
       date(date_add(now(), interval if(dayofweek(now())=1, +1,
                                     if(dayofweek(now())=2, +0,
                                     if(dayofweek(now())=3, -1,
                                     if(dayofweek(now())=4, -2,
                                     if(dayofweek(now())=5, -3,
                                     if(dayofweek(now())=6, -4, -5)))))) day)) as nivers_de
from users
Note que, para saber os aniversariantes desta segunda-feira, preciso olhar dois dias atrás, já que hoje é quarta... Caso quisesse os de sábado, deveria "somar" 3 à data de hoje, para obter o sábado... Então:
select nome, data_nasc
from users
where day(data_nasc)=day(date(date_add(now(), interval if(dayofweek(now())=1, +1,
                                                       if(dayofweek(now())=2, +0,
                                                       if(dayofweek(now())=3, -1,
                                                       if(dayofweek(now())=4, -2,
                                                       if(dayofweek(now())=5, -3,
                                                       if(dayofweek(now())=6, -4, -5)))))) day)))
  and month(data_nasc)=month(date(date_add(now(), interval if(dayofweek(now())=1, +1,
                                                           if(dayofweek(now())=2, +0,
                                                           if(dayofweek(now())=3, -1,
                                                           if(dayofweek(now())=4, -2,
                                                           if(dayofweek(now())=5, -3,
                                                           if(dayofweek(now())=6, -4, -5)))))) day)))

irá listar só os aniversariantes da segunda passada.

Note que, do jeito que preparei a query, você obterá os aniversariantes da próxima segunda-feira, caso a execute no domingo.

Ok?

Espero haver ajudado...

Link para o comentário
Compartilhar em outros sites

  • 0
select nome, data_nasc
from users
where day(data_nasc)=day(date(date_add(now(), interval if(dayofweek(now())=1, +1,
                                                       if(dayofweek(now())=2, +0,
                                                       if(dayofweek(now())=3, -1,
                                                       if(dayofweek(now())=4, -2,
                                                       if(dayofweek(now())=5, -3,
                                                       if(dayofweek(now())=6, -4, -5)))))) day)))
  and month(data_nasc)=month(date(date_add(now(), interval if(dayofweek(now())=1, +1,
                                                           if(dayofweek(now())=2, +0,
                                                           if(dayofweek(now())=3, -1,
                                                           if(dayofweek(now())=4, -2,
                                                           if(dayofweek(now())=5, -3,
                                                           if(dayofweek(now())=6, -4, -5)))))) day)))
irá listar só os aniversariantes da segunda passada. Note que, do jeito que preparei a query, você obterá os aniversariantes da próxima segunda-feira, caso a execute no domingo. Ok? Espero haver ajudado...
Esse código funcionou certinho, poderia me expliar como ele funciona? essa parte eu não entendo, não aprendi ainda, mas é um desafio que o professor passou, no caso como funciona o interval e tal, o (now() if... if... ) :)
[b]day(date(date_add(now()[/b], interval if(dayofweek(now())=1, +1,
                                                       if(dayofweek(now())=2, +0,
                                                       if(dayofweek(now())=3, -1,
                                                       if(dayofweek(now())=4, -2,
                                                       if(dayofweek(now())=5, -3,
                                                       if(dayofweek(now())=6, -4, -5)))))) day)))

Obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Olá...

Bom... coloquei as funções para mostrar o que se pode fazer com funções do próprio MySQL.

Se você ainda não o fez, instale a ajuda do MySQL e use-a como referência.

Um resumo breve das funções utilizadas:

day(): retorna o dia (o número) de uma data.

date(): retorna a data (dia/mês/ano) de uma data (pois now() retorna um conteúdo tipo "timestamp",

isto é, data e hora... com date(), obtemos somente a parte da data mesmo.

dayofweek(): retorna o dia da semana (o número), sendo 1=domingo, 2=segunda-feira, etc...

now(): retorna a data e hora atuais do servidor.

if(): retorna um conteúdo dependendo de uma condição lógica.

date_add(): retorna uma data acrescida de uma determinada quantidade de dias, meses, anos.

Na query, basicamente, subtraio uma quantidade X de dias, se o dia da semana em que estamos

é maior do que 2 - ou seja, a segunda feira, e incremento em um dia, caso hoje seja domingo e,

claro, se hoje for segunda-feira, nem subtraio nem incremtento.

Então... para saber que data foi na segunda passada, sabemos que, se hoje é quarta, temos que

subtrair dois, se hoje é terça, subtrair um, se hoje fosse a própria segunda não subtraimos ou

incrementamos, e assim por diante...

Veja que, se hoje fosse domingo, teriamos que subtrair 6 (usar -6 onde está +1)... coloquei o +1

para exemplificar como obteríamos a próxima segunda-feira, ao invés da segunda-feira passada.

Quanto à função date_add, observe que ela precisa de vários parâmetros. Imagine precisar saber

em que data vai cair um vencimento contando 121 dias de hoje... é onde usamos a função. Veja:

select date(now()), date_add(now(), interval 121 day)

02/09/2009 01/01/2010 17:00:05

E se fossem 60 meses? date_add(now(), interval 60 month)

Veja:

select date(now()), date_add(now(), interval 60 month);

02/09/2009 02/09/2014 17:08:09

Observe:

select date(now()), date_add(now(), interval 365 day), date_add(now(), interval 1 year);

02/09/2009 02/09/2010 17:12:52 02/09/2010 17:12:52

Ok?

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...