2012-09-13 20 views
16

Tengo en la base de datos dos columnas de fecha - from_date y to_date.Rails ActiveRecord - cómo recuperar registros entre dos fechas

Ejemplo:

  • from_date: 2012-09-10
  • to_date: 2012-09-30
  • today: 2012-09-13

Tendría que buscar todos los rec ords, si la fecha de today está entre from_date y to_date. ¿Cómo hacer eso en la consulta SQL?

Si he cargado el registro respectivo, puedo decidir fácilmente, si la fecha de hoy es entre from_date y to_date, pero no sé, cómo recuperar directamente ese registro de la base de datos.

+1

creo que esta pregunta puede ser útil: [fecha de rieles entre ActiveRecord] (http://stackoverflow.com/a/2381825/722783) –

Respuesta

18
data = ModelName.where("today >= from_date AND today <= to_date") 
+5

Esta respuesta es en realidad más general que la de Paulo. La consulta de Paulo asume que tiene un campo ('created_at'in en su respuesta) que espera tener entre dos fechas. ¿Qué sucede si quiero ver si hoy se encuentra entre 'start_date' y' end_date'? No puedo hacer eso con la respuesta de Paulo. – Sebastialonso

4
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date") 
42

Comprobar la Rails guides en condiciones de alcance:

Client.where(created_at: (Time.now.midnight - 1.day)..Time.now.midnight) 

que producirá el siguiente código SQL:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00') 
+15

Esto realmente no responde la pregunta formulada. Él quiere saber cuándo una fecha se encuentra entre el valor de dos columnas separadas, aquí es donde una columna se encuentra entre dos fechas. –

1

usted podría utilizar a continuación joya de encontrar los registros entre las fechas,

Este ge m bastante fácil de usar y más claro By star estoy usando esta joya y la API más clara y la documentación también está bien explicada.

ModelName.between_times(Time.zone.now - 3.hours, # all posts in last 3 hours 
        Time.zone.now) 

Aquí podría pasar nuestro campo también ModelName.by_month("January", field: :updated_at)

Por favor, consulte la documentación y probarlo.

2

Esto debería hacer el truco.

today = Date.today 

data = ModelName.where("from_date <= ? AND to_date >= ?", today, today) 
6

puede utilizar como esto:

Data = Model.where("date(now()) between from_date and to_date") 
1

Ok, después de una larga búsqueda en Google en busca de un "carriles camino" para hacer un medio con dos campos de fecha y una variable, la más aproximada La solución que encontré es crear su propio scope para hacer eso.

en su ApplicationRecord escritura:

class ApplicationRecord < ActiveRecord::Base 

    scope :between_fields, -> (value, initial_date, final_date) { 
    where "('#{value}' BETWEEN #{initial_date} AND #{final_date})" 
    } 

end 

Así mismo, dondequiera que hay que hacer una entre usted puede hacer:

@clients = Client.between_fields(params[:date], :start_date, :final_date) 
# SELECT * FROM clients WHERE ('2017-02-16 00:00:00' BETWEEN start_date AND final_date) 

se puede combinar con otros "donde" para hacer la consulta tan específico como sea necesario

+1

Un ámbito es una buena forma de hacerlo, pero utilizar la interpolación de cadenas es una mala idea para la seguridad. ¡No debería usar la sintaxis '# {string}' dentro de las consultas, especialmente cuando está pasando directamente desde params! –

1

una forma segura y fácil de hacer esto sería:

Model.where(':date BETWEEN from_date AND to_date', date: Date.today) 
Cuestiones relacionadas