年月を表す year_month というカラムが 6 文字の 201812 のような varchar(6)
型になっているのですが
(これはいろいろな場所で使われているので変更できません)
このフィールドを比較検索したいです
https://dev.mysql.com/doc/refman/5.6/ja/cast-functions.html
MySQL にもキャストがあるみたいなのですが
Act.select('CAST(year_month AS SIGNED)') .where('year_month >= ?', '201804')
のようにかくと SQL syntax error になります
記事を読むと string => int は暗黙のうちにやってくれるみたいにかいてるんですが
select をかかなくても SQL syntax エラーになります
https://dev.mysql.com/doc/refman/5.6/ja/string-comparison-functions.html
文字列のまま1文字ずつ比較してくれる strcmp というのもあるみたいなのですが
.where('strcmp(year_month, ?) >= 0', '201804')
とかいてもやはりエラーになります
どうかけばいいのでしょうか…
追記:
controller
puts params[:since] # 201804 が表示される @activities = Act.where(user_id: user_id) @activities.where("year_month >= ?", params[:since]) if params[:since] # ここでフォームから受け取った6文字の年月で表示内容を絞りたい @activities = @activities.order('id desc')
view
<% if @activities.present? %> ...
のところでエラーになります
2行目の where 文を消すとエラーなく表示されます
試した例:
エラーを起こす
.select('STR_TO_DATE(year_month, "%Y%m")')
.where("year_month >= '201804'")
エラーを起こさない
.where("id >= '201804'")
.where(year_month: '201804')
回答3件
あなたの回答
tips
プレビュー