2012-09-13 11 views
16

mam w bazie dwie kolumny dat - from_date i to_date.Rails ActiveRecord - jak pobrać rekordy między dwiema datami

przykład:

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

Potrzebowałabym pobrać wszystkie rek Ords, jeśli data today „s jest między from_date i to_date. Jak to zrobić w zapytaniu SQL?

Jeśli załadowałem odpowiedni rekord, mogę łatwo zdecydować, czy dzisiejsza data jest pomiędzy from_date i to_date, ale nie wiem, jak pobrać prosto ten rekord z bazy danych.

+1

Myślę, że to pytanie może być pomocne: [data ActiveRecord Rails między] (http://stackoverflow.com/a/2381825/722783) –

Odpowiedz

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

Ta odpowiedź jest bardziej ogólna niż u Paulo. Zapytanie Paola zakłada, że ​​masz pole ('created_at' w jego odpowiedzi), które spodziewasz się mieć pomiędzy dwiema datami. Co jeśli chcę się przekonać, czy dzisiaj jest między 'data_początkowa' i' data_końcowa'? Nie można tego zrobić z odpowiedzią Paula. – Sebastialonso

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

Sprawdź Rails guides na warunkach zakres:

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

To będzie produkować następujące SQL:

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

To nie odpowiada na zadane pytanie. Chce wiedzieć, kiedy data jest między wartością dwóch oddzielnych kolumn, to jest, gdy kolumna jest między dwiema datami. –

1

można użyć poniżej gem znaleźć zapisy między datami,

Ten ge m jest dość łatwy w użyciu i bardziej przejrzysty, ponieważ używa tego klejnotu, a API jest bardziej przejrzysty, a dokumentacja również dobrze wyjaśniona.

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

Tutaj można przekazać nasze pole również ModelName.by_month("January", field: :updated_at)

Proszę zapoznać się z dokumentacją i spróbować.

2

To powinno załatwić sprawę.

today = Date.today 

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

można używać tak:

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

Ok, po długich poszukiwaniach w google patrząc na „szyny sposób” zrobić MIĘDZY z dwóch pól daty i zmienna, najbardziej przybliżona rozwiązanie, które znalazłem, to stworzenie własnego scope.

w ApplicationRecord napisz:

class ApplicationRecord < ActiveRecord::Base 

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

end 

Więc teraz, wszędzie tam, gdzie trzeba zrobić między wami może zrobić:

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

Można łączyć je z innymi "gdzie" do zrobienia zapytanie tak szczegółowe, jak potrzebujesz.

+1

Zasięg to dobry sposób na zrobienie tego, ale użycie interpolacji ciągów jest złym pomysłem na bezpieczeństwo. Nie powinieneś używać składni '# {string}' wewnątrz zapytań, zwłaszcza gdy przechodzisz prosto z params! –

1

Bezpieczny i łatwy sposób zrobić to byłoby:

Model.where(':date BETWEEN from_date AND to_date', date: Date.today) 
Powiązane problemy