wake-up-neo.net

Rails ActiveRecord - Abrufen von Datensätzen zwischen zwei Datumsangaben

Ich habe in der Datenbank zwei Datumsspalten - from_date und to_date.

Beispiel:

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

Ich würde alle Datensätze abrufen müssen, wenn das Datum von today zwischen from_date und to_date liegt. Wie mache ich das in einer SQL-Abfrage?

Wenn ich den entsprechenden Datensatz geladen habe, kann ich leicht entscheiden, ob das heutige Datum zwischen from_date und to_date liegt, aber ich weiß nicht, wie ich diesen Datensatz direkt aus der Datenbank abrufen kann.

20
user984621
data = ModelName.where("today >= from_date AND today <= to_date")
20
Salil

Überprüfen Sie die Rails-Führungen on Range-Bedingungen:

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

Das wird die folgende SQL erzeugen:

SELECT * FROM clients WHERE (clients.created_at BETWEEN '2008-12-21 00:00:00' AND '2008-12-22 00:00:00')
45
Paulo Fidalgo

sie können wie folgt verwenden:

Data = Model.where("date(now()) between from_date and to_date")
7
M.Prabha karan
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
5
Ganesh Kunwar

Das sollte den Trick tun. 

today = Date.today

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

Eine sichere und einfache Möglichkeit, dies zu tun, wäre:

Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
2
Tim K

Ok, nach einer langen Suche in Google auf der Suche nach einem "Rails-Weg", um ein ZWEI mit zwei Datumsfeldern und einer Variablen zu erstellen, ist die grösste Lösung, die ich gefunden habe, das Erstellen eines eigenen scope , um dies zu tun.

schreiben Sie in Ihrem ApplicationRecord:

class ApplicationRecord < ActiveRecord::Base

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

end

Also, wo immer Sie zwischendurch etwas unternehmen müssen:

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

Sie können es mit anderen "wo" kombinieren, um Ihre Anfrage so genau wie nötig zu machen.

1
alex

Sie können unten Juwel verwenden, um die Aufzeichnungen zwischen Daten zu finden,

Dieser Edelstein ist recht einfach zu bedienen und übersichtlicher Durch einen Stern bin ich mit diesem Edelstein und der API klarer und die Dokumentation auch gut erklärt. 

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

Hier könnten Sie unser Feld auch ModelName.by_month("January", field: :updated_at) übergeben

Bitte lesen Sie die Dokumentation und versuchen Sie es.

1
Jenorish