2011-05-30 10 views
6

Necesito hacer una consulta sobre las marcas de tiempo del modelo Rails (created_at y updated_at) buscando todos los registros después de una fecha especificada. Al ejecutar la consulta:Rails Fecha después de

Item.where("created_at > :date OR updated_at > :date", date: "2011-05-29") 
> SELECT "items".* FROM "items" WHERE (created_at > '2011-05-29' OR updated_at > '2011-05-29') 

Incluye discos como:

attributes: 
    created_at: 2011-05-29 16:07:10.664227 
    updated_at: 2011-05-29 16:07:10.664229 

Sin embargo, esta fecha no es mayor que la especificada. ¿Alguna forma simple de arreglar esta consulta? Gracias.

Editar:

También he intentado hacer:

Item.where("created_at > :date OR updated_at > :date", date: "2011-05-29 16:07:10") 

Con el mismo resultado, sin embargo, la adición de la fracción de segundo sello da así el resultado correcto.

Respuesta

11

Digamos que quiere registros partir del 30 de mayo:

Luego buscar registros que son> = 2011-05-30 00:00:00:

some_date = Time.now 
Item.where("created_at >= :date OR updated_at >= :date", date: some_date.tomorrow.beginning_of_day) 
3

Creo que el problema es que el created_at y updated_at son de fecha y hora, así que si sólo pasar una fecha predeterminada de 00:00:00 y cualquier cosa pasada es obviamente mayor. Entonces, los registros que está viendo son anteriores a esa fecha, ya que la hora es mayor.

Eche un vistazo a su precisión, puede pasar 1 día más, y mostraré cualquier cosa por encima de ese día, incluso mayor por un segundo, o simplemente pasar la hora como 23:59:59.

+0

Hacer 'datetime' campos requieren una fracción de segundo para ser especificados así? ¡Gracias! –

+0

No, problably solo agregaría 1 día completo, o solo 23:59:59 ambos le daría suficiente precisión. – daniel

1

Desafortunadamente SQL no está de acuerdo con usted:

mysql> SELECT '2011-05-30 12:00:00' > '2011-05-30'; 
+--------------------------------------+ 
| '2011-05-30 12:00:00' > '2011-05-30' | 
+--------------------------------------+ 
|         1 | 
+--------------------------------------+ 

y para comparar las fechas con datetimes, MySQL tiene this to say:

un valor de fecha es forzar el tipo DATETIME mediante la adición de la porción de tiempo como " 00:00:00 '.

0

Puedes usar mi gema by_star para hacer esto.

Post.after(date) 
Cuestiones relacionadas