2012-07-04 47 views
0

我想比較在搜索字段(例如04.07.2012)中輸入的日期與我的表格中的日期(datetime列名爲date)。但是,我似乎無法得到我的SQL查詢直。如何在PostgreSQL中搜索日期?

我的嘗試:

find(:all, :conditions => ['\'to_timestamp(date, \'DD Mon YYYY\')\' LIKE \'to_timestamp(?, \'DD Mon YYYY\')\'', '#{query}']) 

但它失敗:

PG::Error: ERROR: syntax error at or near "DD" 
LINE 1: ...s".* FROM "projects" WHERE ('to_timestamp(date, 'DD Mon YYY... 
                  ^
: SELECT "pacients".* FROM "projects" WHERE ('to_timestamp(date, 'DD Mon YYYY')' LIKE 'to_timestamp('#{query}', 'DD Mon YYYY')') 

我是一個真正的新手,只要(postgre)SQL而言,我會很感激的一些提示寫這個查詢的正確方向。

非常感謝!

+0

務必理解PostgreSQL中[數據類型'timestamp'和'date'](http://www.postgresql.org/docs/current/interactive/datatype-datetime.html)之間的區別。 –

回答

3

那樣貧瘠指出,有幾個問題在這裏:

  • 不正確的字符串插值
  • 使數據庫做更多的工作不是必要的,使用LIKE當你能做到日更直接搜索:

讓ActiveRecord的日期格式輸入,直接使用SQL比較的日期,是這樣的:

start_date = Date.civil(2012, 7, 4) 
end_date = Date.civil(2012, 7, 20) 
User.where(["date BETWEEN ? AND ?", start_date, end_date]) 

將數據庫中的源日期和日期轉換爲格式化爲字符串的時間戳記,然後使用LIKE的表現很差,表現也很差。

+0

謝謝,這是我最終使用的。 在我project.rb型號: '高清self.search(查詢) \t開始 \t \t如果查詢 \t \t \t Project.where([ 「?BETWEEN日期和」,Date.parse(查詢), Date.parse(查詢)]) \t \t其他 \t \t \t Project.all \t年底 \t救援引發ArgumentError \t \t Project.all \t結束 – mo5470