2012-09-13 24 views
16

Ho nel database due colonne di data - from_date e to_date.Rails ActiveRecord - come recuperare i record tra due date

Esempio:

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

Avrei bisogno di recuperare tutte le rec ords, se la data di today è compresa tra from_date e to_date. Come farlo nella query SQL?

Se ho caricato il rispettivo record, posso facilmente decidere, se la data odierna è compresa tra from_date e to_date, ma non so, come recuperare tali record dal database.

+1

penso che questa domanda può essere utile: [Rails ActiveRecord data tra] (http://stackoverflow.com/a/2381825/722783) –

risposta

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

Questa risposta è in realtà più generale di quella di Paulo. La query di Paulo presuppone che tu abbia un campo ('created_at' nella sua risposta) che ti aspetti di avere tra due date. Cosa succede se voglio vedere se oggi è tra 'start_date' e' end_date'? Non posso farlo con la risposta di Paulo. – Sebastialonso

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

Controllare il Rails guides sulle condizioni di Gamma:

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

che produrrà il seguente SQL:

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

Questo in realtà non risponde alla domanda posta. Vuole sapere quando una data è tra il valore di due colonne separate, questo è dove una colonna è tra due date. –

1

si potrebbe usare sotto gemma per trovare i record tra le date,

Questo ge m abbastanza facile da usare e più chiaro By star sto usando questo gioiello e l'API più chiara e la documentazione anche ben spiegata.

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

Qui si poteva passare il nostro campo anche ModelName.by_month("January", field: :updated_at)

consultare la documentazione e provarlo.

2

Questo dovrebbe fare il trucco.

today = Date.today 

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

è possibile utilizzare in questo modo:

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

Ok, dopo una lunga ricerca in google alla ricerca di un "modo delle rotaie" per fare un TRA con due campi data e una variabile, la più approssimativa la soluzione che ho trovato è creare il tuo scope per farlo.

nel ApplicationRecord scrittura:

class ApplicationRecord < ActiveRecord::Base 

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

end 

Così ora, ovunque è necessario fare una fra voi può fare:

@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) 

si può combinare con gli altri "in cui" fare la query specifico di cui hai bisogno.

+1

Un ambito è un buon modo per farlo, ma l'uso dell'interpolazione di stringhe è una cattiva idea per la sicurezza. Non dovresti usare la sintassi '# {string}' all'interno delle query, specialmente quando stai passando direttamente da params! –

1

un modo sicuro e facile da fare questo sarebbe:

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