Pregunta

Estoy intentando reproducir esta consulta SQL que se utiliza con ActiveRecord:

Post.all(:conditions => ["EXTRACT(MONTH from created_at) = ? AND EXTRACT(YEAR from created_at) = ?", month, year])

Pero ya que estoy convirtiendo todo para DataMapper que estaba buscando una manera de hacer esto ...

¿Alguien puede ayudar?

¿Fue útil?

Solución

supongo ya que este está etiquetado con "ruby-on-rails" que tiene ActiveSupport cargado. Esto proporcionará el método # end_of_month ayudante de tiempo. Con él se puede reescribir la consulta como:

time = Date.new(year, month).to_time

Post.all(:created_at => time..time.end_of_month)

Esto no sólo es más simple, elimina SQL prima a partir de la consulta (por lo que la consulta es más portátil a cosas que no sean RDBMS), y lo más importante es probable que realizar mucho mejor que la otra consulta. Con EXTRACT la base de datos es probable que tenga que realizar un escaneo completo de tabla para extraer el año y el mes de created_at en cada fila , y luego compararlos con los valores esperados. Si usted tiene un gran conjunto de datos, esto podría ser una carga significativa en su base de datos. Sin embargo, siempre que su columna created_at está indexado, el enfoque anterior debe ser extremadamente eficiente en comparación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top