質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

3回答

3883閲覧

Oracle ORDER BY

tentem

総合スコア26

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

1クリップ

投稿2016/05/23 01:59

あるカラムに「2000-01-01」や「2013-06-18」
の様な日付の入っているカラムがあるのですが、
これを年では降順、月では昇順で表示させたいのですが、
調べてみても求める答えが出てこず困り果てております。(自分の調べ方が悪いだけかもですが・・・)
どのようにすれば良いのかご存知の方お教えください。
また、やり方が掲載されているwebページをご存知の方、URLを教えていただけるとうれしいです。
よろしくおねがいいたします・・・。

表示例
2013-01-01
2013-01-08



2000-12-03
2000-12-30

こんな感じでございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/05/23 02:03

「あるカラム」のデータ型は日付型ですか? それとも文字列型ですか?
tentem

2016/05/23 02:30

遅くなり申し訳ありません。 日付の入っているカラムはデータ型でございます。
argius

2016/05/23 02:41

ありがとうございます。デート(Date)型ですよね? もう回答してしまいましたが...
tentem

2016/05/23 02:49

そうです、DATE型でございます。何度も申し訳ありません・・・。
guest

回答3

0

mysql での動作確認になりますが、2つの SQL 例を示します。

その1

sql

1SELECT 2 ym.id, 3 ym.date, 4 ym.username 5FROM ( 6 SELECT 7 id, 8 YEAR(date) as year, 9 MONTH(date)) as month, 10 date, 11 username 12 FROM 13 user 14) AS ym 15ORDER BY year desc, month asc

year, month の列を追加したテーブルを作り、それを year desc, month asc で order by しています。

その2

SELECT ym.id, ym.date, ym.username FROM ( SELECT id, YEAR(date) * 100 + (13 - MONTH(date)) as yy_13mm, date, username FROM user ) AS ym ORDER BY yy_13mm desc

2016-04に対しては 201609, 2016-05に対しては 201608, ... という整数をもつ列をつくり、
その列に対して ORDER BY desc しています。

dd, hh, mm, dd についてもソートをしこみたい場合は、 方法2の拡張のほうが対応しやすいです。

実行例

イメージ説明

イメージ説明

イメージ説明

投稿2016/05/23 14:34

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

考え方としては、ソートキーの第1キーを「年」の降順、第2キーを「月」(実際は月日ですよね?)の昇順にすれば良さそうですね。
具体的な処理は既に回答が挙がっているので省きます。

年月日のフィールドを分割(あるいは変換)するのにはそれなりのコストがかかるので、データが多い場合は注意が必要です。

DATE型の場合は時刻の部分の考慮をどうするかも気になります。
同日の場合に時刻でソートする必要があるなら時刻もソートキーに含めないとですね。
第2キーをto_char(カラム, 'MMDDHH24MISS')にするとか。

投稿2016/05/23 02:19

編集2016/05/23 02:40
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ORDER BYとして、日付列から計算して指定するという方法があります。

sql

1SELECT 内容 FROM テーブル名 ORDER BY YEAR(date_col) DESC, DAYOFYEAR(date_col) ASC;

ただし、このような方法を取るとインデックスが効かないので遅くなります。よく使うのであれば、年だけ、月日だけの関数インデックスを入れたほうがいいでしょう。

投稿2016/05/23 02:06

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問