2009-03-11 15 views
6

created_at öğesini tarih (standart) olarak depoladığım bir ray uygulamasına sahibim. Arama için bir form yapıyorum ve bazı karmaşık alt sorgular yapmak için find_by_sql kullanmam gerektiğini buluyorum. Formun, create_at alanı öğeleri için aranacak bir tarih aralığı (zaman yok) vardır.Rails/MySQL DateTime Sütunu için Tarih Aralığını Doğru Olarak Dönüştürme veya Sorgulama Nasıl Yapılır

bulduğum sorun ben ... aralık sorgulamak için sadece tarih dizesinde

... status_changes.created_at between '2009-01-24' and '2009-03-12' ... 

geçirirseniz ben 2009-01-23 17 bir created_at tarihine sahip kayıtları geri alıyorum olmasıdır: 10:39 -0800 çünkü bu db'de saklanıyor çünkü 2009-01-24 01:10:39 (UTC)

Sonuç, söz konusu kaydın geri getirilmemesi için bunu nasıl düzeltebilirim?

O

Herhangi tutanlar ... ben de UTC özel olabilir veya geçerli saat dilimine dayalı yerine UTC olarak sütun okuma aranacak find_by_sql anlatmak için tarih aralığını dönüştürmek gerekir görünüyor?

John

cevap

4

Ben bu eski bir soru olduğunu biliyorum ama cevap için CONVERT_TZ hakkında sorgulama yapıldığında:

Yüklenmemiş mySQL zaman çizelgesi tablolarına sahip olmadığınız sürece (ki bu bir vanilya yüklemesinde oldukça olası), saat dilimlerini UTC'den bir ofset olarak girmeniz gerekir.

CONVERT_TZ(status_changes.created_at, '+00:00', '+08:00') between '2009-01-24' and '2009-03-12') 
+0

Teşekkür Ürdün (tip 'tarih' veritabanı alanıdır itibaren). Eminim bunu her an test edeceğim, ama cevabın makul görünüyor. – Streamline

1

MySQL bir datetime alır ve başka bir saat diliminde gelen dönüştürür bir CONVERT_TZ işlevi vardır. Sorgunuzu, depolanan değerden (UTC) yerel saat diliminize (PST) dönüştürmek için oluşturabilirsiniz.

CONVERT_TZ(status_changes.created_at,'UTC',?) between ? and ?, 'PST, '2009-01-24', '2009-03-10' 
7

Eğer find_by_sql kullanmak değil, 's Raylar değiştirmelerin yapmak, otomatik olarak her şeyi dönüştürür izin bir :conditions maddesi ile find kullanmıyorsanız. Raylar tarihleri ​​karıştı eğer

Model.find :all, 
    :conditions => ["created_at between ? and ?", start_date, end_date] 

En kötü durumda, sen zamanlarda çevirebiliriz ve güzel oynaması gerektiğini:

Model.find :all, 
    :conditions => ["created_at between ? and ?", 
        start_date.to_time, end_date.to_time] 
0

Ian'ın yanıtını denedim, ancak çok çalışmadı. Kayıtlar kaydedildiğinde ve yüklendiğinde raylar doğru zaman dilimini idare ediyor, ancak sorgu parametreleri için aynı şeyi yapmıyor gibi görünüyor. Üzerinde çalıştığım uygulamanın Rails 2.1.1'de olduğunu unutmayın, o zamandan beri işler biraz gelişti.

Bir küçük ayarlamayla, Ian'ın çözüm çalışmasını yapabildim ancak: getutc yöntemini kullanarak UTC saat diliminde zaman değerini alın ve bunu parametre olarak iletin. Bu, UTC zamanı yalnızca zaman dilimi tarafından değiştirilmediğinden, zaman parametresi bölgesini doğru bir şekilde işleyebilecek daha sonraki Rails sürümlerinde de herhangi bir zarara neden olmamalıdır. Raylar veritabanında UTC tarihleri ​​sakladığından

0

Eğer Time veya DateTime

yani üzerinde utc yöntemi kullanmalısınız

Model.find :all, 
    :conditions => ["created_at between ? and ?", start_date.utc, end_date.utc] 
+0

Daha fazla bilgi için http://marklunds.com/articles/one/402 adresine bakın. – paulodeon

12

Bunu yapmanın çağdaş ActiveRecord yoludur:

Model.where(time_field: date1..date2) 
-1
Model.where(:from => "2012-01-01".to_date.."2012-06-30".to_date) 

benim için çalıştı:

İlgili konular