38 Stimmen

Datensätze mit Datetime finden, die mit dem heutigen Datum übereinstimmen - Ruby on Rails

Ich habe eine Tabelle mit Geschäften und muss Datensätze finden, bei denen das Datum mit dem heutigen Datum übereinstimmt.

In der Rails-Konsole sieht das Datumsfeld, das ich abgleichen muss, wie folgt aus. Ich habe einen Datensatz zum Testen zugewiesen.

ruby-1.9.2-p0 > deal.start
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

Wenn ich versuche, Datensätze zu finden, die das Startdatum mit dem heutigen Tag übereinstimmen, erhalte ich null

ruby-1.9.2-p0 > Deal.find_by_start(Date.today)
=> nil

dann dachte ich, ich könnte durch die Konvertierung von Date.today in eine Datetime übereinstimmen.

ruby-1.9.2-p0 > Date.today.to_datetime
=> Tue, 10 May 2011 00:00:00 +0000 
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime)
=> nil

Wie kann ich das zum Laufen bringen? Ich verwende Rails 3.

Bearbeiten: Ich dachte darüber nach, beide in ein einheitliches Format zu konvertieren, das funktioniert, aber nicht, wenn ich versuche, die find_by_start-Methode zu verwenden

ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
=> true 

ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
NoMethodError: undefined method `strftime' for nil:NilClass

74voto

Ilya Punkte 13088

Rails 5.1 hat eingeführt Date#all_day die ein Bereichsobjekt für ein bestimmtes Datum zurückgibt:

Deal.where(start: Date.today.all_day)

Sie können auch SQL verwenden DATE() Funktion für Ihr Ziel, z.B.:

@deals = Deal.where('DATE(start) = ?', Date.today)

54voto

tadman Punkte 200181

Denken Sie daran, dass eine DateTime ein Datum und eine Uhrzeit enthält. Sie suchen also nach Datensätzen, die einen genauen Wert haben, nicht nur denselben Tag.

Es gibt zwei Möglichkeiten, dies zu tun. Sie können entweder den Zeitraum vom Beginn bis zum Ende des Tages auswählen oder Sie können eine date Spalte, um Ihre Daten besser gruppieren zu können.

Die Version mit Reichweite sieht so aus:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all

Die andere erfordert die Erstellung einer neuen start_date Spalte in Ihrer Tabelle und füllt sie entsprechend mit den Daten auf. Sie können dieses Datum indizieren und Ihre Abfragen viel schneller ausführen lassen, da Bereichsauswahlen bei großen Datensätzen nicht immer schnell sind.

10voto

Peter Punkte 121

Für diejenigen, die noch mit Rails 4 arbeiten:

Um die obige Antwort von not_a_patch zu ergänzen, würde ich verwenden:

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day)

denn Time.zone verwendet UTC (so wie Ihr Datums-Zeit-Feld gespeichert ist), während DateTime.now wird nicht.

> DateTime.now
=> Fri, 08 Sep 2017 11:28:21 -0400
> Time.zone.now
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X