2012-12-03 18 views
7

Próbuję wyszukać model dla dowolnych dat równych określonej dacie, pomijając sygnaturę czasową. W Rails może po prostu wykonać to jako DateTime.to_date == somedate, jednak nie sądzę, że to tak łatwo formułować w SQL, gdzie nie będzie w stanie zastosować metodę TO_DATE do całej kolumny jak created_at:Szyny 3 Porównanie datetime w/Data w zapytaniu ActiveRecord

Foo.where("created_at == some_day_without_time_stamp").count 

Początkowo myślałem, że ponieważ korzystałem z bazy danych postgresql, mogłem po prostu użyć składni psql, ale wolę pozostawić ją w ActiveRecord, aby zdecydować, jaki sql jest najbardziej odpowiedni i utrzymać mój kod agnostyczny wobec dostawców baz danych. Czy jest to możliwe bez dodatkowych wtyczek i klejnotów?

+1

Czy można wykonać element created_at> = some_day_with_00: 00: 00 znacznik czasu i create_at Tad

+0

@Tad Najwyraźniej mogę, dzięki za pomoc. Jeśli napiszesz to jako odpowiedź, zaakceptuję to. – Noz

+0

Nie ma za co - odpowiedź dodana poniżej – Tad

Odpowiedz

4

Spróbuj created_at >= some_day_with_00:00:00 timestamp and create_at < some_day_plus_one_with_00:00:00 timestamp

9

chciałbym zrobić coś takiego ...

someday = Date.today 
Foo.where(:created_at => (someday)..(someday + 1.day)) 

byłoby to uchwycić wszystkie created_at dniach między północą someday i someday + 1. Jest to opcja włączająca (więc zawierałaby funkcję Foo stworzoną podczas północy w dniu +1), ale może być "wystarczająco dobra" dla Twoich potrzeb bez zniekształcania znaczników czasu.

Dla uprzejmość, chciałbym owinąć go jako scope

scope :on_day, (lambda do |someday| 
    where(:created_at => (someday)..(someday + 1.day)) 
end) 

Więc

Foo.on_day(Date.yesterday).count 

jest dobrze czytelny.

+0

Masz wyłączone przez jednego, co może prowadzić do dwukrotnego liczenia dni. To była moja poprawka: 'where (: created_at => (someday) .. (someday + 23.hours + 59. minut + 59.seconds))' –

9

Klasa DateTime ma dwie przydatne metody: beginning_of_day i end_of_day.

w tym przypadku, w którym masz obiekt Date, można zrobić:

Foo.where('created_at >= #{Date.today.to_time.beginning_of_day} AND 
      created_at <= #{Date.today.to_time.end_of_day}') 

Zauważ, że masz do przekształcić obiekt Date na obiekt DateTime

7

Z zakresu:

scope :on_day, (lambda do |day| 
    where(date: day.beginning_of_day..day.end_of_day) 
end) 

Zastosowanie:

Foo.on_day(Date.today).count 
Powiązane problemy