Exibir Aniversariantes do mês

157 views
Skip to first unread message

Renato Ramiro

unread,
Feb 8, 2012, 9:26:08 PM2/8/12
to rails-br
Tenho um campo na minha tabela que se chama dataNascimento do tipo
date.
Estou tentando exibir todos as pessoas que fazem aniversário este mês,
mas não estou conseguindo.

Vi em algum lugar esse código, mas ele não funciona:
@socios = Socio.where("STRFTIME('%m', dataNascimento) = ?",
Date.today.month)

Alguma dica?

Everaldo Gomes

unread,
Feb 8, 2012, 10:03:25 PM2/8/12
to rail...@googlegroups.com
Tenta assim:

@socios = Socio.where("MONTH(dataNascimento) = ?", Date.today.month)

2012/2/9 Renato Ramiro <renat...@gmail.com>

--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

Renato Ramiro

unread,
Feb 9, 2012, 6:59:29 AM2/9/12
to rail...@googlegroups.com
Nada ainda. Apareceu essa mensagem de erro:
SQLite3::SQLException: no such function: MONTH: SELECT "socios".* FROM "socios"  WHERE (MONTH(dataNascimento) = 2)
--
Renato Ramiro

Everaldo Gomes

unread,
Feb 9, 2012, 7:12:54 AM2/9/12
to rail...@googlegroups.com
Procurei na Internet e o que eu achei foi o que você colocou no primeiro post.

Agora, uma pergunta besta: na sua base de dados existem pessoas que fazem aniversário em fevereiro?

Qual erro aparecia antes?

2012/2/9 Renato Ramiro <renat...@gmail.com>

Renato Ramiro

unread,
Feb 9, 2012, 7:26:51 AM2/9/12
to rail...@googlegroups.com
kkkkkkkkk.. Existem pessoas que fazem aniversário em fevereiro sim.
Não aparecia erro nenhum, só não aparecia ninguém.
Se eu colocar uma data específica, aparece de boa.
@socios = Socio.where("dataNascimento = ?", Date.new(1980,02,10))

Rogerio Medeiros

unread,
Feb 9, 2012, 7:26:48 AM2/9/12
to rail...@googlegroups.com
@socios = Socio.where("'MONTH(dataNascimento) = ?",  Time.now.month)

testa esse

--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+u...@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7



--
att,

Rogerio

A complicação se descomplica na mesma proporção que fazemos os nós se desatarem ao tecer o conhecimento do saber.

Rogerio Medeiros

unread,
Feb 9, 2012, 7:27:27 AM2/9/12
to rail...@googlegroups.com
SQLite3 nao tem essa funçao senao me engano

Rogerio Medeiros

unread,
Feb 9, 2012, 7:28:06 AM2/9/12
to rail...@googlegroups.com
Passa o banco pra mysql que resolve

Renato Ramiro

unread,
Feb 9, 2012, 7:30:25 AM2/9/12
to rail...@googlegroups.com
Blz. Agora não posso testar, mas quando eu puder dou um retorno.
Valew galera.

Rogerio Medeiros

unread,
Feb 9, 2012, 7:33:18 AM2/9/12
to rail...@googlegroups.com
Ve se consegue com isso lol


@socios = Socio.where("strftime('%m','dataNascimento') = ?",  Time.now.month)

Cezinha

unread,
Feb 9, 2012, 7:33:23 AM2/9/12
to rails-br
procura a função equivalente a MONTH pro SQLITE

On 9 fev, 10:30, Renato Ramiro <renato....@gmail.com> wrote:
> Blz. Agora não posso testar, mas quando eu puder dou um retorno.
> Valew galera.
>
> Em 9 de fevereiro de 2012 09:28, Rogerio Medeiros <arge...@gmail.com>escreveu:
>
>
>
>
>
>
>
>
>
> > Passa o banco pra mysql que resolve
>
> > Em 9 de fevereiro de 2012 09:26, Renato Ramiro <renato....@gmail.com>escreveu:
>
> > kkkkkkkkk.. Existem pessoas que fazem aniversário em fevereiro sim.
> >> Não aparecia erro nenhum, só não aparecia ninguém.
> >> Se eu colocar uma data específica, aparece de boa.
> >> @socios = Socio.where("dataNascimento = ?", Date.new(1980,02,10))
>
> >> Em 9 de fevereiro de 2012 09:12, Everaldo Gomes <everaldo.go...@gmail.com
> >> > escreveu:
>
> >> Procurei na Internet e o que eu achei foi o que você colocou no primeiro
> >>> post.
>
> >>> Agora, uma pergunta besta: na sua base de dados existem pessoas que
> >>> fazem aniversário em fevereiro?
>
> >>> Qual erro aparecia antes?
>
> >>> 2012/2/9 Renato Ramiro <renato....@gmail.com>
>
> >>>> Nada ainda. Apareceu essa mensagem de erro:
>
> >>>> SQLite3::SQLException: no such function: MONTH: SELECT "socios".* FROM "socios"  WHERE (MONTH(dataNascimento) = 2)
>
> >>>> Em 9 de fevereiro de 2012 00:03, Everaldo Gomes <
> >>>> everaldo.go...@gmail.com> escreveu:
>
> >>>> Tenta assim:
>
> >>>>> @socios = Socio.where("MONTH(dataNascimento) = ?", Date.today.month)
>
> >>>>> 2012/2/9 Renato Ramiro <renato....@gmail.com>
>
> >>>>>> Tenho um campo na minha tabela que se chama dataNascimento do tipo
> >>>>>> date.
> >>>>>> Estou tentando exibir todos as pessoas que fazem aniversário este mês,
> >>>>>> mas não estou conseguindo.
>
> >>>>>> Vi em algum lugar esse código, mas ele não funciona:
> >>>>>> @socios = Socio.where("STRFTIME('%m', dataNascimento) = ?",
> >>>>>> Date.today.month)
>
> >>>>>> Alguma dica?
>
> >>>>>> --
> >>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>> Groups "rails-br".
> >>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>> rail...@googlegroups.com
> >>>>>> Para se descadastrar, mande um e-mail para
> >>>>>> rails-br+u...@googlegroups.com
> >>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>>  --
> >>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>> Groups "rails-br".
> >>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>> rail...@googlegroups.com
> >>>>> Para se descadastrar, mande um e-mail para
> >>>>> rails-br+u...@googlegroups.com
> >>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>> --
> >>>> Renato Ramiro
>
> >>>>  --
> >>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>> Groups "rails-br".
> >>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>> rail...@googlegroups.com
> >>>> Para se descadastrar, mande um e-mail para
> >>>> rails-br+u...@googlegroups.com
> >>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>  --
> >>> Você recebeu essa mensagem porquê está inscrito no Google
> >>> Groups "rails-br".
> >>> Para enviar uma mensagem para o grupo, mande um email para
> >>> rail...@googlegroups.com
> >>> Para se descadastrar, mande um e-mail para
> >>> rails-br+u...@googlegroups.com
> >>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >> --
> >> Renato Ramiro
>
> >>  --
> >> Você recebeu essa mensagem porquê está inscrito no Google
> >> Groups "rails-br".
> >> Para enviar uma mensagem para o grupo, mande um email para
> >> rail...@googlegroups.com
> >> Para se descadastrar, mande um e-mail para
> >> rails-br+u...@googlegroups.com
> >> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >> Leia nossa política de uso:http://goo.gl/YGgt7
>
> > --
> > att,
>
> > Rogerio
>
> > A complicação se descomplica na mesma proporção que fazemos os nós se
> > desatarem ao tecer o conhecimento do saber.
>
> >  --
> > Você recebeu essa mensagem porquê está inscrito no Google
> > Groups "rails-br".
> > Para enviar uma mensagem para o grupo, mande um email para
> > rail...@googlegroups.com
> > Para se descadastrar, mande um e-mail para
> > rails-br+u...@googlegroups.com
> > Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR

Rogerio Medeiros

unread,
Feb 9, 2012, 7:33:39 AM2/9/12
to rail...@googlegroups.com
vai testanto tirando as aspas depois lol

André Rodrigues Pereira

unread,
Feb 9, 2012, 7:45:08 AM2/9/12
to rail...@googlegroups.com
Atenção se for usar Time.now em scope. Já tive problemas disso retornar data errada, meio que um cache da primeira data, em produção. 

Atenciosamente,
André Rodrigues Pereira

Marcos Filho

unread,
Feb 9, 2012, 7:48:42 AM2/9/12
to rail...@googlegroups.com
Recentemente eu tive que fazer isso, mas com Postgresql.

Não sei como é no sqlite, mas no Postgresql também não tem a função MONTH... tem o date_part.

Fiz da seguinte forma:

@pessoas = pessoas.find(:all, :order => "date_part('day', nascimento) asc", :conditions => ["date_part('month', nascimento) = ?" , Date.today.month])

Abs

Everaldo Gomes

unread,
Feb 9, 2012, 7:51:56 AM2/9/12
to rail...@googlegroups.com
A sintaxe do SQLite é como o Renato colocou no primeiro post. Mas por algum motivo não funcionou.

2012/2/9 Marcos Filho <mvict...@gmail.com>

Diogo Menezes

unread,
Feb 9, 2012, 8:57:20 AM2/9/12
to rail...@googlegroups.com
Já não gostei disso.

Isso deveria ser independente do banco de dados, senão não faz sentido nenhum ter um ORM abstraído.

O correto é trocar o banco sem ter nenhum impacto na aplicação.

Deveria ter um DIALECT como o Hibernate tem.

Diogo Menezes

unread,
Feb 9, 2012, 9:02:06 AM2/9/12
to rail...@googlegroups.com
Renato, e provavelmente o  STRFTIME não está funcionando pois ele retorna um STRING e você está comparando com um INT.

Experimenta algo como  @socios = Socio.where("STRFTIME('%m', dataNascimento) = '2') 

Rogerio Medeiros

unread,
Feb 9, 2012, 9:04:00 AM2/9/12
to rail...@googlegroups.com
aff ribernet é um saco nem vem lol

Diogo Menezes

unread,
Feb 9, 2012, 9:17:27 AM2/9/12
to rail...@googlegroups.com
Vou te falar que desenvolvi aplicações para a OI e para a Globo que utilizam Nhibernate e tem milhões e milhões de dados e nunca tive reclamações, pelo contrário.

O  Nhibernate  é sensacional principalmente em sua versão 3.x, não é a toa que a M$ contratou a consultoria do Fabio para criar o EF4.

É uma questão de saber usar, muita gente por ai realmente não sabe.

Enfim, testa sua query com string que deve funcionar.

@socios = Socio.where("STRFTIME('%m', dataNascimento) = '2')  

Abs

Everaldo Gomes

unread,
Feb 9, 2012, 9:18:16 AM2/9/12
to rail...@googlegroups.com
Acho que deve ter algum dialeto sim.

Provavelmente ActiveRecord retorna um objeto Date. É só fazer a comparação correta.

Mas eu estou com preguiça para isso...a implementação fica a cargo do leitor.

2012/2/9 Rogerio Medeiros <arg...@gmail.com>

Rogerio Medeiros

unread,
Feb 9, 2012, 9:22:46 AM2/9/12
to rail...@googlegroups.com
Sem essa active record é muito massa lol

Renato Ramiro

unread,
Feb 9, 2012, 9:43:20 AM2/9/12
to rail...@googlegroups.com
Ainda sem sucesso com a query que o Diogo passou. Tá dificil esse negócio..
Renato Ramiro

Everaldo Gomes

unread,
Feb 9, 2012, 9:53:25 AM2/9/12
to rail...@googlegroups.com
Vi na Internet que pode ser o seguinte:

Meses com número menor que 10 retornam com 1 dígito apenas. Talvez o seu banco retorne 02, que é diferente de 2:


sales = Sale.find(:all,
  :conditions => ["strftime('%m', date) = '?' AND strftime('%Y', date) = '?'",
    '%02d' % Date.today.month, Date.today.year])


Nesse caso aqui ele usa ano também, mas é só ignorar essa parte.



2012/2/9 Renato Ramiro <renat...@gmail.com>

Rogerio Medeiros

unread,
Feb 9, 2012, 9:54:15 AM2/9/12
to rail...@googlegroups.com
https://github.com/radar/by_star tenta essa gem lol

Renato Ramiro

unread,
Feb 9, 2012, 10:00:01 AM2/9/12
to rail...@googlegroups.com
Everaldo, funcionou direitinho.
Também vou dar uma olhada nessa gem Rogerio.
Valeu galera.

Diogo Menezes

unread,
Feb 9, 2012, 10:03:29 AM2/9/12
to rail...@googlegroups.com
Bom, descobri.

Fiz um select  STRFTIME('%m', data)  e reparei que ele retorna "02" e não "2".

resolvi com um cast para integer par atirar o 0 a esquerda.

 @socios = Socio.where("cast(STRFTIME('%m', dataNascimento) as integer) = 2")  

posiciona se solucionar, mas aqui funcionou 100%

abraços.

Everaldo Gomes

unread,
Feb 9, 2012, 10:06:46 AM2/9/12
to rail...@googlegroups.com
Conseguimos! =)

Juntamos um batalhão mas resolvemos kkkk....de 3 maneiras diferentes ainda.

2012/2/9 Diogo Menezes <diogol...@gmail.com>

Rogerio Medeiros

unread,
Feb 9, 2012, 10:08:38 AM2/9/12
to rail...@googlegroups.com
where("created_at between ? AND ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month)

Ta ai o capeta lol xo rribernet lol

Em 9 de fevereiro de 2012 11:54, Rogerio Medeiros <arg...@gmail.com> escreveu:

 Victor Sobreira

unread,
Feb 9, 2012, 10:32:33 AM2/9/12
to rail...@googlegroups.com
Sale.find(:all, :conditions => ["extract( month from date) = '?' AND extract(year from date) = '?'",Date.today.month, Date.today.year])
Atenciosamente,
 Victor Sobreira

Celular: TIM (85) 8719-3391
Msn / Gtalk: vict...@gmail.com
Skype: victorcsv1

Renato Ramiro

unread,
Feb 9, 2012, 12:16:51 PM2/9/12
to rail...@googlegroups.com
A query que o Diogo colocou funcionou direitinho.
Mas a query do Victor nao funcionou nao.

Valeu mesmo galera.

Rogerio Medeiros

unread,
Feb 9, 2012, 12:26:23 PM2/9/12
to rail...@googlegroups.com
Usa a minha ue lol, pode ser em qualquer banco

Renato Ramiro

unread,
Feb 9, 2012, 12:53:47 PM2/9/12
to rail...@googlegroups.com
Vou testar aqui também Rogério, num fique triste não.. (brincadeira)

Diogo Menezes

unread,
Feb 9, 2012, 9:33:13 AM2/9/12
to rail...@googlegroups.com
Funcionou com a string ?

Renato Ramiro

unread,
Feb 10, 2012, 6:36:48 AM2/10/12
to rail...@googlegroups.com
Com a query que o Rogerio passou, o sistema pega todos os socios. Alterei pra 'dataNascimento' e não funcionou.
O sistema não pega nenhum sócio.
Renato Ramiro

Rogerio Medeiros

unread,
Feb 10, 2012, 7:01:50 AM2/10/12
to rail...@googlegroups.com
where("dataNascimento between ? AND ?", Time.zone.now.beginning_of_month, Time.zone.now.end_of_month)

Nao funcionou com essa ? vou testar aqui, dataNascimento é um datetime ?

Renato Ramiro

unread,
Feb 10, 2012, 7:06:51 AM2/10/12
to rail...@googlegroups.com
Não, dataNascimento é um date.

Everaldo Gomes

unread,
Feb 10, 2012, 7:09:58 AM2/10/12
to rail...@googlegroups.com
Acontece que o cara nasceu em 1990, por exemplo. Mas ele só quer saber o dia e mês...

2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Rogerio Medeiros

unread,
Feb 10, 2012, 7:19:00 AM2/10/12
to rail...@googlegroups.com

where("dataNascimento between ? AND ?", Time.zone.now.to_date.beginning_of_month, Time.zone.now.to_date.end_of_month)

Teste assim meu filho lol, rapaz tu ta me dando trabalho lol

Renato Ramiro

unread,
Feb 10, 2012, 7:27:20 AM2/10/12
to rail...@googlegroups.com
Grande Rogério,

A query não retornou nada.

Rogerio Medeiros

unread,
Feb 10, 2012, 7:28:30 AM2/10/12
to rail...@googlegroups.com
Tem algo cadastrado nesse mes ?

Everaldo Gomes

unread,
Feb 10, 2012, 7:31:47 AM2/10/12
to rail...@googlegroups.com
Essa query só iria retornar quem nasceu neste mês em 2012.

2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Renato Ramiro

unread,
Feb 10, 2012, 7:33:00 AM2/10/12
to rail...@googlegroups.com
Existem alguns socios cadastrados nesse mes.

Rogerio Medeiros

unread,
Feb 10, 2012, 7:33:10 AM2/10/12
to rail...@googlegroups.com
é verdade lol

Everaldo Gomes

unread,
Feb 10, 2012, 7:42:23 AM2/10/12
to rail...@googlegroups.com
É aniversário de nascimento ou aniversário de cadastro?

2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Renato Ramiro

unread,
Feb 10, 2012, 7:45:12 AM2/10/12
to rail...@googlegroups.com
Aniversário de Nascimento. A data que a pessoa nasceu.
No form eu to ignorando o ano. Só exibo o dia e o mes.
:discard_year => true

Rogerio Medeiros

unread,
Feb 10, 2012, 7:47:42 AM2/10/12
to rail...@googlegroups.com
@contatos = Contato.find(:all,  :select => "contatos.nome, contatos.nascimento, contatos.email,
    empresa.nome", :include => [:empresa], :order => "DAY(nascimento) = #{Time.now.strftime("%e")}
    AND MONTH(nascimento) = #{Time.now.strftime("%m")} desc")

quando eu fiz era com mysql, vou pesquisar aqui como deixar padrao em qualquer banco lol

Everaldo Gomes

unread,
Feb 10, 2012, 7:48:03 AM2/10/12
to rail...@googlegroups.com
Outra solução bizarra e ineficiente que pode ser adotada:

Calcule a idade de todas as pessoas no dia 31 de Janeiro
Calcula a idade de todas as pessoas no dia 1 de Março

Quem aumentou a idade em 1 ano, fez aniversário em Fevereiro. =)

2012/2/10 Renato Ramiro <renat...@gmail.com>

Everaldo Gomes

unread,
Feb 10, 2012, 7:49:48 AM2/10/12
to rail...@googlegroups.com
Acho que já mandaram a resposta padrão ontem, Rogério. Veja na thread....

Eu supus que era essa, enviada pelo Victor:

Sale.find(:all, :conditions => ["extract( month from date) = '?' AND extract(year from date) = '?'",Date.today.month, Date.today.year])

não conheço a função extract

2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Rogerio Medeiros

unread,
Feb 10, 2012, 7:53:23 AM2/10/12
to rail...@googlegroups.com
eu tambem nao lol entao morreu

Renato Ramiro

unread,
Feb 10, 2012, 7:55:35 AM2/10/12
to rail...@googlegroups.com
Até agora a única que funcionou foi essa:
@socios = Socio.where("cast(STRFTIME('%m', dataNascimento) as integer) = ?", Date.today.month).order(:dataNascimento)

Qual o problema com ela? Só funciona para o Sqlite é?

Everaldo Gomes

unread,
Feb 10, 2012, 7:55:18 AM2/10/12
to rail...@googlegroups.com
Mas a condição dessa cláusula está errada....agora que percebi

2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Everaldo Gomes

unread,
Feb 10, 2012, 7:57:39 AM2/10/12
to rail...@googlegroups.com
Acho que só funciona no SQLite, a menos que STRFTIME esteja presente nos outros bancos.

Aquela que eu mandei não funcionou?

Que verifica se tem zero à esquerda etc.

2012/2/10 Renato Ramiro <renat...@gmail.com>

Rogerio Medeiros

unread,
Feb 10, 2012, 8:00:27 AM2/10/12
to rail...@googlegroups.com
Testa essa

@socios = Socio.where("extract(month from dataNascimento) = ? ", Date.today.month)

e depois essa

@socios = Socio.where("extract(month from dataNascimento) = '?' ", Date.today.month)

Renato Ramiro

unread,
Feb 10, 2012, 8:03:41 AM2/10/12
to rail...@googlegroups.com
A primeira query apareceu esse erro:
SQLite3::SQLException: near "from": syntax error: SELECT "socios".* FROM "socios"  WHERE (extract(month from dataNascimento) = 2 )


E a segunda query apareceu esse erro:
SQLite3::SQLException: near "from": syntax error: SELECT "socios".* FROM "socios"  WHERE (extract(month from dataNascimento) = '2' )

Rogerio Medeiros

unread,
Feb 10, 2012, 8:12:41 AM2/10/12
to rail...@googlegroups.com
Qual versao do rails e sqlite ? gem puts era pra dar certo

Renato Ramiro

unread,
Feb 10, 2012, 8:15:14 AM2/10/12
to rail...@googlegroups.com
rails 3.2.1
sqlite3 1.3.5

Rogerio Medeiros

unread,
Feb 10, 2012, 8:18:18 AM2/10/12
to rail...@googlegroups.com
ve se colocando isso no gem file resolve

gem 'arel', :git => 'git://github.com/rails/arel.git'

e da um bundle install

vou criar um projeto aqui com campo date lol

Renato Ramiro

unread,
Feb 10, 2012, 8:24:17 AM2/10/12
to rail...@googlegroups.com
O erro ainda persiste.

Rogerio Medeiros

unread,
Feb 10, 2012, 8:24:48 AM2/10/12
to rail...@googlegroups.com
axu que nao tem extract no slite

Em 10 de fevereiro de 2012 10:18, Rogerio Medeiros <arg...@gmail.com> escreveu:

Everaldo Gomes

unread,
Feb 10, 2012, 9:40:04 AM2/10/12
to rail...@googlegroups.com
Um jeito de fazer independentemente do banco de dados.

class Person << AR::BASE


  def self.aniversariantes_mes
    mes_atual = Time.zone.now.to_date.beginning_of_month..Time.zone.now.to_date.end_of_month
    all.select { |p|  mes_atual.include?(p.data_nascimento) }
  end
end

O que acham?

P.S: Talvez seja melhor ter um model aniversariantes_mes e colocar umas callbacks after_create e after_destroy na classe Pessoa para atualizar os aniversariantes cada vez que um usuário for cadastrado e/ou deletado.


2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Everaldo Gomes

unread,
Feb 10, 2012, 9:42:21 AM2/10/12
to rail...@googlegroups.com
Putz, viajei na maionese de novo.

Esqueci que tem que comparar somente o mês, porque é aniversariante...desse jeito que eu mandei não vai funcionar mesmo.

2012/2/10 Everaldo Gomes <everald...@gmail.com>

Everaldo Gomes

unread,
Feb 10, 2012, 9:43:48 AM2/10/12
to rail...@googlegroups.com
Nova tentativa:

  def self.aniversariantes_mes
    mes_atual = Time.zone.now.to_date.month
    all.select { |p|  mes_atual == p.data_nascimento.month }
  end


Será que é isso?


2012/2/10 Everaldo Gomes <everald...@gmail.com>

Renato Ramiro

unread,
Feb 10, 2012, 9:52:51 AM2/10/12
to rail...@googlegroups.com
Agora funcionou Everaldo.
lol
Valeu mesmo..

Rogerio Medeiros

unread,
Feb 10, 2012, 9:57:08 AM2/10/12
to rail...@googlegroups.com
finalmente lol

Everaldo Gomes

unread,
Feb 10, 2012, 10:47:06 AM2/10/12
to rail...@googlegroups.com
Que bom!

Então, na hora que você quiser otimizar o sistema, considere construir o Model AniversariantesMes - porque aí você calcula isso 1 vez só, e depois só atualiza quando inserir/remover usuários. Do jeito que está, toda vez você tem que percorrer sua tabela de pessoas, o que pode se tornar ineficiente se essa tabela tiver, 1 milhão de registsros, por exemplo.

Mas faça isso só quando for otimizar...por enquanto dá para deixar assim.

Abraços,
Everaldo

2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Luiz Florentino

unread,
Feb 10, 2012, 11:11:03 AM2/10/12
to rail...@googlegroups.com
Everaldo,

Melhor do que construir um model é ter um atributo mes_aniversario:integer.

Daí faz algo como:

@socios = Socio.where("mes_aniversario = ?", Date.today.month)

Na hora de criar/cadastrar o Socio faz: 

before_save :define_mes_aniversario

def define_mes_aniversario
  mes_aniversario = data_nascimento.month
end

Será que funciona?

Enviado via iPhone

Luiz Augusto B. Florentino Filho

unread,
Feb 10, 2012, 11:55:01 AM2/10/12
to rail...@googlegroups.com
Testei aqui e deu certo. Só faltou uns "self" que esqueci de colocar..

Segue em: http://pastie.org/3355622

Abraços,
Luiz

Everaldo Gomes

unread,
Feb 10, 2012, 11:56:03 AM2/10/12
to rail...@googlegroups.com
Luiz,

concordo com você. Parece bem melhor mesmo. Aí acho que é só acrescentar um index para otimizar a consulta.

Eu só trocaria before_save por before_create.

Att.

Everaldo



2012/2/10 Luiz Florentino <luizflo...@gmail.com>

Luiz Augusto B. Florentino Filho

unread,
Feb 10, 2012, 11:57:35 AM2/10/12
to rail...@googlegroups.com
Perfeito!

Luiz Augusto B. Florentino Filho

unread,
Feb 10, 2012, 11:58:39 AM2/10/12
to rail...@googlegroups.com
Vai que na hora do cadastro a pessoa erra o mês e depois precisar alterar... como que fica? =P



Em 10 de fevereiro de 2012 13:56, Everaldo Gomes <everald...@gmail.com> escreveu:

Rogerio Medeiros

unread,
Feb 10, 2012, 12:03:10 PM2/10/12
to rail...@googlegroups.com
Eu axu que seria melhor fazer um hleper lol

Everaldo Gomes

unread,
Feb 10, 2012, 12:09:57 PM2/10/12
to rail...@googlegroups.com


2012/2/10 Rogerio Medeiros <arg...@gmail.com>

Eu axu que seria melhor fazer um hleper lol

Em 10 de fevereiro de 2012 13:58, Luiz Augusto B. Florentino Filho <luizflo...@gmail.com> escreveu:

Vai que na hora do cadastro a pessoa erra o mês e depois precisar alterar... como que fica? =P


Não havia pensado nisso. Ótimo argumento!

Não sei se tem jeito, mas talvez desse para fazer assim: toda vez que a data de nascimento é alterada o mês é alterado. Pena ficar com essa redundância no banco de dados. =/

Mas fizemos ótimos exercícios com esse pequeno problema, né?

Renato Ramiro

unread,
Feb 10, 2012, 12:12:53 PM2/10/12
to rail...@googlegroups.com
Ótimas dicas.. Ainda estou engatinhando no Rails.

Obrigado pela ajuda.

Rogerio Medeiros

unread,
Feb 10, 2012, 12:19:30 PM2/10/12
to rail...@googlegroups.com
Socio.all.each do |t|
    puts t.dataNascimento if t.dataNascimento.month == Date.today.month
end

Dava pra fazer isso ai lol

Na index colocar um parms[:commit] == "month"

Luiz Augusto B. Florentino Filho

unread,
Feb 10, 2012, 12:25:26 PM2/10/12
to rail...@googlegroups.com
Rogério,

A solução que você apresentou é legal. Mas a minha idéia era evitar trazer vários objetos do banco de dados e otimizar a consulta SQL.

Nesse domínio específico, acredito que dificilmente a tabela "socio" passe de 1000 registros que ainda sim é muito pouco.

De qualquer forma, fica aqui várias soluções para o problema.

Miguel Akira

unread,
Feb 10, 2012, 5:54:02 PM2/10/12
to rails-br
Não funcionaria com um range?
Algo como:

range = Time.now.beginning_of_month..Time.now.end_of_month
@socios = Socio.all(:conditions => {:dataNascimento => range} )

Dessa maneira ficaria independente do banco de dados. Se não puder u

On Feb 9, 1:00 pm, Renato Ramiro <renato....@gmail.com> wrote:
> Everaldo, funcionou direitinho.
> Também vou dar uma olhada nessa gem Rogerio.
> Valeu galera.
>
> Em 9 de fevereiro de 2012 11:54, Rogerio Medeiros <arge...@gmail.com>escreveu:
>
>
>
>
>
>
>
>
>
> >https://github.com/radar/by_startenta essa gem lol
>
> > Em 9 de fevereiro de 2012 11:43, Renato Ramiro <renato....@gmail.com>escreveu:
>
> > Ainda sem sucesso com a query que o Diogo passou. Tá dificil esse negócio..
>
> >> Em 9 de fevereiro de 2012 11:22, Rogerio Medeiros <arge...@gmail.com>escreveu:
>
> >> Sem essa active record é muito massa lol
>
> >>> Em 9 de fevereiro de 2012 11:18, Everaldo Gomes <
> >>> everaldo.go...@gmail.com> escreveu:
>
> >>> Acho que deve ter algum dialeto sim.
>
> >>>> Provavelmente ActiveRecord retorna um objeto Date. É só fazer a
> >>>> comparação correta.
>
> >>>> Mas eu estou com preguiça para isso...a implementação fica a cargo do
> >>>> leitor.
>
> >>>> 2012/2/9 Rogerio Medeiros <arge...@gmail.com>
>
> >>>>> aff ribernet é um saco nem vem lol
>
> >>>>> Em 9 de fevereiro de 2012 11:02, Diogo Menezes <
> >>>>> diogolmene...@gmail.com> escreveu:
>
> >>>>> Renato, e provavelmente o  STRFTIME não está funcionando pois ele
> >>>>>> retorna um STRING e você está comparando com um INT.
>
> >>>>>> Experimenta algo como  @socios = Socio.where("STRFTIME('%m',
> >>>>>> dataNascimento) = '2')
>
> >>>>>> Em 9 de fevereiro de 2012 11:57, Diogo Menezes <
> >>>>>> diogolmene...@gmail.com> escreveu:
>
> >>>>>> Já não gostei disso.
>
> >>>>>>> Isso deveria ser independente do banco de dados, senão não faz
> >>>>>>> sentido nenhum ter um ORM abstraído.
>
> >>>>>>> O correto é trocar o banco sem ter nenhum impacto na aplicação.
>
> >>>>>>> Deveria ter um DIALECT como o Hibernate tem.
>
> >>>>>>> Em 9 de fevereiro de 2012 10:51, Everaldo Gomes <
> >>>>>>> everaldo.go...@gmail.com> escreveu:
>
> >>>>>>> A sintaxe do SQLite é como o Renato colocou no primeiro post. Mas
> >>>>>>>> por algum motivo não funcionou.
>
> >>>>>>>> 2012/2/9 Marcos Filho <mvictor....@gmail.com>
>
> >>>>>>>>> Recentemente eu tive que fazer isso, mas com Postgresql.
>
> >>>>>>>>> Não sei como é no sqlite, mas no Postgresql também não tem a
> >>>>>>>>> função MONTH... tem o *date_part*.
>
> >>>>>>>>> Fiz da seguinte forma:
>
> >>>>>>>>> @pessoas = pessoas.find(:all, :order => "date_part('day',
> >>>>>>>>> nascimento) asc", :conditions => ["date_part('month', nascimento) = ?" ,
> >>>>>>>>> Date.today.month])
>
> >>>>>>>>> Abs
>
> >>>>>>>>>  --
> >>>>>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>>>>> Groups "rails-br".
> >>>>>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>>>>> rail...@googlegroups.com
> >>>>>>>>> Para se descadastrar, mande um e-mail para
> >>>>>>>>> rails-br+u...@googlegroups.com
> >>>>>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>>>>>  --
> >>>>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>>>> Groups "rails-br".
> >>>>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>>>> rail...@googlegroups.com
> >>>>>>>> Para se descadastrar, mande um e-mail para
> >>>>>>>> rails-br+u...@googlegroups.com
> >>>>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>>>> --
> >>>>>>> Abraços,
>
> >>>>>>> Diogo Menezes
> >>>>>>>http://dmenezes.com.br
> >>>>>>>http://twitter.com/diogolmenezes
>
> >>>>>> --
> >>>>>> Abraços,
>
> >>>>>> Diogo Menezes
> >>>>>>http://dmenezes.com.br
> >>>>>>http://twitter.com/diogolmenezes
>
> >>>>>> --
> >>>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>>> Groups "rails-br".
> >>>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>>> rail...@googlegroups.com
> >>>>>> Para se descadastrar, mande um e-mail para
> >>>>>> rails-br+u...@googlegroups.com
> >>>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>> --
> >>>>> att,
>
> >>>>> Rogerio
>
> >>>>> A complicação se descomplica na mesma proporção que fazemos os nós se
> >>>>> desatarem ao tecer o conhecimento do saber.
>
> >>>>>  --
> >>>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>>> Groups "rails-br".
> >>>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>>> rail...@googlegroups.com
> >>>>> Para se descadastrar, mande um e-mail para
> >>>>> rails-br+u...@googlegroups.com
> >>>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>>>  --
> >>>> Você recebeu essa mensagem porquê está inscrito no Google
> >>>> Groups "rails-br".
> >>>> Para enviar uma mensagem para o grupo, mande um email para
> >>>> rail...@googlegroups.com
> >>>> Para se descadastrar, mande um e-mail para
> >>>> rails-br+u...@googlegroups.com
> >>>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >>> --
> >>> att,
>
> >>> Rogerio
>
> >>> A complicação se descomplica na mesma proporção que fazemos os nós se
> >>> desatarem ao tecer o conhecimento do saber.
>
> >>>  --
> >>> Você recebeu essa mensagem porquê está inscrito no Google
> >>> Groups "rails-br".
> >>> Para enviar uma mensagem para o grupo, mande um email para
> >>> rail...@googlegroups.com
> >>> Para se descadastrar, mande um e-mail para
> >>> rails-br+u...@googlegroups.com
> >>> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >>> Leia nossa política de uso:http://goo.gl/YGgt7
>
> >> --
> >> Renato Ramiro
>
> >>  --
> >> Você recebeu essa mensagem porquê está inscrito no Google
> >> Groups "rails-br".
> >> Para enviar uma mensagem para o grupo, mande um email para
> >> rail...@googlegroups.com
> >> Para se descadastrar, mande um e-mail para
> >> rails-br+u...@googlegroups.com
> >> Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR
> >> Leia nossa política de uso:http://goo.gl/YGgt7
>
> > --
> > att,
>
> > Rogerio
>
> > A complicação se descomplica na mesma proporção que fazemos os nós se
> > desatarem ao tecer o conhecimento do saber.
>
> >  --
> > Você recebeu essa mensagem porquê está inscrito no Google
> > Groups "rails-br".
> > Para enviar uma mensagem para o grupo, mande um email para
> > rail...@googlegroups.com
> > Para se descadastrar, mande um e-mail para
> > rails-br+u...@googlegroups.com
> > Visite o grupo emhttp://groups.google.com/group/rails-br?hl=pt-BR

Miguel Akira

unread,
Feb 10, 2012, 5:56:10 PM2/10/12
to rails-br
Opa foi mal, vi apenas as primeiras 25 mensagens e não vi que tinha
mais 50 posts depois!

On Feb 10, 8:54 pm, Miguel Akira <miguel.ak...@gmail.com> wrote:
> Não funcionaria com um range?
> Algo como:
>
> range = Time.now.beginning_of_month..Time.now.end_of_month
> @socios = Socio.all(:conditions => {:dataNascimento => range} )
>
> Dessa maneira ficaria independente do banco de dados. Se não puder u
>
> On Feb 9, 1:00 pm, Renato Ramiro <renato....@gmail.com> wrote:
>
>
>
>
>
>
>
> > Everaldo, funcionou direitinho.
> > Também vou dar uma olhada nessa gem Rogerio.
> > Valeu galera.
>
> > Em 9 de fevereiro de 2012 11:54, Rogerio Medeiros <arge...@gmail.com>escreveu:
>
> > >https://github.com/radar/by_startentaessa gem lol

Miguel Akira

unread,
Feb 10, 2012, 6:08:47 PM2/10/12
to rails-br
Se for fazer um range com Date ao invés de Time, poderia fazer por
exemplo:

range = Date.today.beginning_of_month..Date.today.end_of_month
@socios = Socio.all(:conditions => {:dataNascimento => range })


On Feb 10, 8:56 pm, Miguel Akira <miguel.ak...@gmail.com> wrote:
> Opa foi mal, vi apenas as primeiras 25 mensagens e não vi que tinha
> mais 50 posts depois!
>
> On Feb 10, 8:54 pm, Miguel Akira <miguel.ak...@gmail.com> wrote:
>
>
>
>
>
>
>
> > Não funcionaria com um range?
> > Algo como:
>
> > range = Time.now.beginning_of_month..Time.now.end_of_month
> > @socios = Socio.all(:conditions => {:dataNascimento => range} )
>
> > Dessa maneira ficaria independente do banco de dados. Se não puder u
>
> > On Feb 9, 1:00 pm, Renato Ramiro <renato....@gmail.com> wrote:
>
> > > Everaldo, funcionou direitinho.
> > > Também vou dar uma olhada nessa gem Rogerio.
> > > Valeu galera.
>
> > > Em 9 de fevereiro de 2012 11:54, Rogerio Medeiros <arge...@gmail.com>escreveu:
>
> > > >https://github.com/radar/by_startentaessagem lol

Everaldo Gomes

unread,
Feb 10, 2012, 6:12:30 PM2/10/12
to rail...@googlegroups.com
Miguel,

o problema é que o range guarda dia/mês/ano

e para saber se a pessoa é aniversariante precisa apenas do mês.

O range seria assim:

1/2/2012..28/2/2012

Imagine que eu nasci no dia 14/02/1988:

1/2/2012..28/2/2012.include?(14/02/1988)

A resposta seria false.

Eu mesmo mandei umas duas soluções erradas usando range, porque sempre me esquecia que era o aniversário que ele queria.

Att.
Everaldo

2012/2/10 Miguel Akira <miguel...@gmail.com>

Tiago Garcia

unread,
Mar 23, 2012, 4:51:15 PM3/23/12
to rail...@googlegroups.com
Boa tarde pessoal.

Sei que o topico é grande, li todas as opçoes e nenhuma funcinou comigo.

recebo um parametro, com a string ou integer ( 3 )

scope :mes, lambda {|mes|
    where("indate.month == :t", :t => mes )
  }

tenho fazer esse scope ai.

quero filtrar pela data trazendo somente do mes 3.

nenhuma das opçoes acima tive sucesso.

Ideias?

Rogerio Medeiros

unread,
Mar 24, 2012, 11:41:18 AM3/24/12
to rail...@googlegroups.com
Ta usando qual banco ?

Rogerio Medeiros

unread,
Mar 24, 2012, 11:44:16 AM3/24/12
to rail...@googlegroups.com
com mysql

scope :mes, lambda {|mes|
    where("MONTH(indate) = ?, mes )

Luiz Augusto

unread,
Mar 27, 2012, 9:03:11 PM3/27/12
to rail...@googlegroups.com
Correçãozinha: faltou uma " depois da ? na resposta do rogério :)
Atenciosamente,
Luiz Augusto da S. Crisóstomo

Reply all
Reply to author
Forward
0 new messages