2017-01-10 71 views
1

如何選擇日期過去的所有記錄?Ruby on Rails - 查詢時間解析

我有格式爲'%m /%d /%Y'的「日期」列,例如「01/10/2017」。 列類型是字符串,我不能更改類型。

我該如何寫查詢。

類似於:Article.where(Time.parse(:date).past?)

我需要純RoR的解決方案,沒有任何寶石。

+1

什麼數據庫?大多數數據庫都提供了一些日期解析選項,但它將是數據庫特定的。儘管如此,我會盡可能遷移到真正的日期類型列。這是一個可怕的日期格式,因爲它無法簡單地進行數字比較,就像ISO 8601日期一樣。 – max

+1

由於您的設置不典型,請提供哪個數據庫以及數據外觀的一個小例子。 – max

回答

1

這可能會實現,如果你的底層數據庫可以使用MySQL STR_TO_DATE功能:

Article.where("STR_TO_DATE(date, '%m/%d/%Y') < ?)", Time.now) 
+0

不幸的是它是一個字符串。 –

+0

更新了一個適用於MySQL的答案,或者如果使用其他數據庫實現,您可能會做類似的工作。 – wjordan

+0

wjordan它完美的作品! :) –

0

除非您可以使用本機SQL函數,否則您將無法解析字符串列。

您可能需要考慮將日期列重新格式化爲更傳統的日期時間格式,但您也可以使用chronic

在遷移:

Article.find_each do |article| 
    stamp = Chronic.parse(article.date) 
    article.update_attributes(date: stamp) 
end 

總之,chronic可以很容易地處理非常規的日期格式,你種得回事。如果你運行上面的遷移,你可以運行下面的查詢,這是更清潔:

Article.where("date <= ?", Time.now)

+0

Hi @NickM嗨,感謝您的回覆,但我需要帶有純RoR的解決方案,無需任何寶石。 –

0

我相信這應該爲你工作:

Article.where('date < ?', Time.now)

這將p所有的日期都在今天之前。

編輯: 該死的,我正在寫這個答案,而其他三人正在寫同樣的事情。對不起

+0

由於OP的日期存儲在字符串列中,因此不會以任何方式工作。 –

+0

我沒有注意到,謝謝。這是一個問題。雖然我不確定他爲什麼不能回滾並更改列類型,但這可能與其他應用程序有關。 – LBarry