2017-01-10 6 views
1

日付が過去のすべてのレコードを選択するにはどうすればよいですか?Ruby on Rails - 時間解析付きのクエリ

「%m /%d /%Y」の形式の「日付」列があります。たとえば、「01/10/2017」です。 列の型は文字列です。型を変更することはできません。

どのようにクエリを書く必要がありますか。

何かのように:Article.where(Time.parse(:date).past?)

純粋なRoRのソリューションが必要ですが、宝石はありません。

+1

どのようなデータベースですか?ほとんどのDBは日付解析オプションを提供しますが、DB固有のものになります。私は実際の日付型の列に移行します。それは単にISO 8601日付のように数値的に単純に比較することはできないので、恐ろしい日付形式です。 – max

+1

あなたの設定は典型的ではないので、どのDBを提供してください、そして、データがどのように見えるかの小さな例を提供してください。 – max

答えて

1

:あなたは上記の移行を実行する場合、あなたは非常にきれいで、次のクエリを実行することができますこれはあなたのために働く必要があると考えている:

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

この意志P今日の日付が今日より前のすべてのレコードを取り除く。

編集: 私はこの回答を書いていましたが、他の3人が同じことを書いていました。申し訳ありません

+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("STR_TO_DATE(date, '%m/%d/%Y') < ?)", Time.now) 
+0

こんにちは@NickM、ご返信ありがとうございますが、純粋なRoRのソリューションが必要です。 –

0

:あなたの基礎となるデータベースは、MySQL STR_TO_DATE機能を使用することができる場合、これは、うまくいくかもしれない

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

+0

OPには日付が文字列に格納されているため、どちらの方法でも動作しません。 –

+0

私は気付かなかった、ありがとう。それは問題です。なぜ私は列のタイプをロールバックしたり変更したりすることができないのか分かりませんが、それはおそらく残りのアプリケーションと関係があります。 – LBarry