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.
data = ModelName.where("today >= from_date AND today <= to_date")
Ü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')
sie können wie folgt verwenden:
Data = Model.where("date(now()) between from_date and to_date")
data = ModelName.find(:all, :conditions => "today >= from_date and today <= to_date")
Das sollte den Trick tun.
today = Date.today
data = ModelName.where("from_date <= ? AND to_date >= ?", today, today)
Eine sichere und einfache Möglichkeit, dies zu tun, wäre:
Model.where(':date BETWEEN from_date AND to_date', date: Date.current)
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.
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.