如何選擇日期過去的所有記錄?Ruby on Rails - 查詢時間解析
我有格式爲'%m /%d /%Y'的「日期」列,例如「01/10/2017」。 列類型是字符串,我不能更改類型。
我該如何寫查詢。
類似於:Article.where(Time.parse(:date).past?)
?
我需要純RoR的解決方案,沒有任何寶石。
如何選擇日期過去的所有記錄?Ruby on Rails - 查詢時間解析
我有格式爲'%m /%d /%Y'的「日期」列,例如「01/10/2017」。 列類型是字符串,我不能更改類型。
我該如何寫查詢。
類似於:Article.where(Time.parse(:date).past?)
?
我需要純RoR的解決方案,沒有任何寶石。
這可能會實現,如果你的底層數據庫可以使用MySQL STR_TO_DATE
功能:
Article.where("STR_TO_DATE(date, '%m/%d/%Y') < ?)", Time.now)
除非您可以使用本機SQL函數,否則您將無法解析字符串列。
您可能需要考慮將日期列重新格式化爲更傳統的日期時間格式,但您也可以使用chronic
。
在遷移:
Article.find_each do |article|
stamp = Chronic.parse(article.date)
article.update_attributes(date: stamp)
end
總之,chronic
可以很容易地處理非常規的日期格式,你種得回事。如果你運行上面的遷移,你可以運行下面的查詢,這是更清潔:
Article.where("date <= ?", Time.now)
Hi @NickM嗨,感謝您的回覆,但我需要帶有純RoR的解決方案,無需任何寶石。 –
我相信這應該爲你工作:
Article.where('date < ?', Time.now)
這將p所有的日期都在今天之前。
編輯: 該死的,我正在寫這個答案,而其他三人正在寫同樣的事情。對不起
由於OP的日期存儲在字符串列中,因此不會以任何方式工作。 –
我沒有注意到,謝謝。這是一個問題。雖然我不確定他爲什麼不能回滾並更改列類型,但這可能與其他應用程序有關。 – LBarry
什麼數據庫?大多數數據庫都提供了一些日期解析選項,但它將是數據庫特定的。儘管如此,我會盡可能遷移到真正的日期類型列。這是一個可怕的日期格式,因爲它無法簡單地進行數字比較,就像ISO 8601日期一樣。 – max
由於您的設置不典型,請提供哪個數據庫以及數據外觀的一個小例子。 – max