2011-05-10 14 views
25

Tengo una tabla de ofertas y necesito encontrar registros donde la fecha coincida con la fecha de hoy.Buscar registros con fecha y hora que coincidan con la fecha de hoy - Ruby on Rails

Desde la consola de rieles, el campo de fecha que necesito para emparejar se ve así. He asignado un registro para tratar para la prueba.

ruby-1.9.2-p0 > deal.start 
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

Si trato de encontrar los registros que coincidan con la fecha de inicio hoy como esto me sale nula

ruby-1.9.2-p0 > Deal.find_by_start(Date.today) 
=> nil 

entonces pensé que podría coincidir mediante la conversión de Date.today a una fecha y hora.

ruby-1.9.2-p0 > Date.today.to_datetime 
=> Tue, 10 May 2011 00:00:00 +0000 
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime) 
=> nil 

¿Cómo puedo hacer que funcione? Estoy usando Rails 3.

Editar: pensé en convertir a los dos a un formato coherente, que serán las obras, pero no cuando se trata de utilizar el método find_by_start

ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
=> true 

ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y") 
NoMethodError: undefined method `strftime' for nil:NilClass 

Respuesta

46

Tenga en cuenta un DateTime tiene una fecha y hora, por lo que está buscando registros que tengan un valor preciso, no solo el mismo día.

Puede hacerlo de dos maneras. Puede seleccionar el rango de tiempo desde el comienzo del día hasta el final, o puede crear una columna date para ayudarlo a agrupar mejor sus datos.

versión de la gama es el siguiente:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all 

El otro requiere la creación de una nueva columna start_date en su mesa y poblarlo con las fechas en consecuencia. Puede indexar esta fecha y hacer que sus consultas se ejecuten mucho más rápido, ya que las selecciones de rango no siempre son rápidas en grandes conjuntos de datos.

+0

Gracias. Esto funciona muy bien y lo usaré a corto plazo y veré la refacturación de mi código para mejorar el rendimiento. Gracias por tu ayuda. –

+12

También hay una versión más sucinta usando rangos. @deals = Deal.where (start: DateTime.now.beginning_of_day .. DateTime.now.end_of_day) –

+0

Me parece que 'Deal.where (start: Time.zone.now.midnight)' también funciona. –

23

Rails 5.1 ha introducido Date#all_day ayudante, que devuelve un objeto de rango para una fecha determinada, por lo que puede escribir:

Deal.where(start: Date.today.all_day) 

También puede utilizar la función de SQL DATE() para su objetivo, por ejemplo:

@deals = Deal.where('DATE(start) = ?', Date.today) 
2

Para aquellos que todavía en los carriles 4:

para aumentar la respuesta de not_a_patch arriba, utilizaría:

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) 

porque Time.zone va a usar UTC (que es como se almacena el campo de fecha y hora), mientras que DateTime.now no lo hará.

> DateTime.now 
=> Fri, 08 Sep 2017 11:28:21 -0400 
> Time.zone.now 
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00 
Cuestiones relacionadas