とあるイベントを管理するものだとします(日付:open_at)
↓まだ未開催のイベント(日付が今日以降のもの)
直近
↓
さらに後
↓すでに開催済みのイベント(日付が今日以前のもの)
最近終わったもの
↓
昔に終わったもの
の順番でソートしたいのですがどうしたら良いのでしょうか?
できればrails5での解決方法で教えていただきたいですが、どのようなSQLで解決すべきなのかも教えていただけると幸いです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
mysqlでやるとこんな感じになります
postgreと若干書式は違うとおもうので順次よみかえてください
SQL
1create table tbl(id int unique,d date); 2insert into tbl values 3(1,'2018-03-12'), 4(2,'2018-03-13'), 5(3,'2018-03-14'), 6(4,'2018-03-15'), 7(5,'2018-03-16');
- 抽出
SQL
1select * from tbl 2order by case when d>='2018-03-14' then 0 else 1 end asc 3,abs(datediff(d,'2018-03-14')) asc
- 対象日を含む未来日を優先し
- 対象日との差の絶対値=なんにち離れているかでソート
投稿2018/03/15 01:26
総合スコア114843
0
どのくらいの件数でしょうか。
今日以降分と昨日以前分にソートキーをつけて
unionすればいけると思います。
SQL
1select * from ( 2 select *, 0 as sortkey1, open_at - now() as sortkey2 from table where open_at => now() -- 今日以降 3 union all 4 select *, 1 as sortkey1, now() - open_at as sortkey2 from table where open_at < now() -- 昨日以前 5) order by sortkey1, sortkey2
今日を含む未来日と過去日を判定するためにsortkey1を
日付の順序性をsortky2としています。
now()
は時間まで入ってしまうので、丸めが必要かもしれません。
投稿2018/03/14 05:16
総合スコア1400
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
postgresはよく知りませんが[open_at]列を降順で並べればいいだけでは?
sql
1select * 2from イベントテーブル 3order by open_at desc
あとorder by はselectで使った計算式の列名をそのまま並び順に利用できるはず。
sql
1select *,case when open_at>=CURRENT_DATE then 0 else 1 end as 今日以降 2from イベントテーブル 3order by 今日以降,open_at desc
postgresでは違うのかな?
#追記
case を使えばどうとでもできます。全部書けばいいです。
1.今日以降かどうか
2.今日以降なら昇順(今日未満の日は適当に置き換え、今回はNULL)
3.今日未満なら降順(今日以降の日は適当に置き換え、今回はNULL)
sql
1create table test( 2 open_at date 3); 4 5insert into test(open_at) 6select X.open_at 7from ( 8 select cast('2018-03-16' as date) as open_at 9 union all 10 select cast('2018-03-15' as date) as open_at 11 union all 12 select cast('2018-03-14' as date) as open_at 13 union all 14 select cast('2018-03-13' as date) as open_at 15 union all 16 select cast('2018-03-12' as date) as open_at 17) as X 18 19select * 20 ,case when open_at>=CURRENT_DATE then 0 else 1 end as 今日以降かどうか 21 ,case when open_at>=CURRENT_DATE then open_at end as 今日以降日付 22 ,case when open_at>=CURRENT_DATE then null else open_at end as 今日未満日付 23from test 24order by 今日以降かどうか,今日以降日付,今日未満日付 desc
投稿2018/03/14 02:02
編集2018/03/14 04:31総合スコア3828
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/14 02:19
2018/03/14 03:49
2018/03/14 04:32
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。