アプリ版:「スタンプのみでお礼する」機能のリリースについて

簡単な問題だと思いますが、教えてください。

データベースに日付がchar(2)型で入ってます。
この日付に従いソートしてListに入れたいと思ったのですが、
単純にorder by day asc だと
1→10→11→12→(・・・)→19→2→20→21→22→(・・・)→29→3→30→31
となり、日付順になりません。
もちろん
1→2→3→(・・・)→9→10→11→・・・
としたいです。
java側で処理してもいいと思ったのですが、
DBを交換するリスクもなさそうなので
どうにかSQLの側でやりたいです。
このchar型の日付をnumber型にconvrtか何かしたものを
order byの条件にしたいです。
答えを教えていただければありがたいですが、
こんな風に検索したら自分で分かるでしょと言うアドバイスだと
もっといいです。
すみませんが力を貸してください。

A 回答 (1件)

>このchar型の日付をnumber型にconvrtか何かしたものを


>order byの条件にしたいです。

ここはMySQLのカテゴリですが、Oracleの質問ですか?
MySQLには、number型は存在しませんけど?
RDBMS名、バージョンを、明記してください。

それに、日付をchar(2)に格納するメリットを、あまり思いつかないのですが?

MySQLならば、以下のようなSQLで可能と思います。

select * from tbl1 order by cast(c1 as signed);

この回答への補足

ご回答ありがとうございます。
MySQLを使っています。
確かにnumber型はないですね・・
tinyintかintにします。
http://dev.mysql.com/doc/refman/4.1/ja/cast-func …
のリファレンスを参考にしながら書いたのですが、どうもキャストが使えないようなのです。
sql文:SELECT year, month, day FROM Calendar WHERE year = ? month = ? ORDER BY cast ( day as signed ) ASC
エラー文:Incorrect parameters in the call to stored function 'cast'

com.mysql.jdbc.SQLError:createSQLException(936)
com.mysql.jdbc.MysqlIO:checkErrorPacket(2985)
com.mysql.jdbc.MysqlIO:sendCommand(1631)
com.mysql.jdbc.MysqlIO:sqlQueryDirect(1723)
com.mysql.jdbc.Connection:execSQL(3256)
com.mysql.jdbc.PreparedStatement:executeInternal(1313)
com.mysql.jdbc.PreparedStatement:executeQuery(1448)

MySQLのバージョンはMySQL5.xですので、cast()は使えるはずなのですが・・・
(?にはsetString()してあります)

補足日時:2007/10/26 09:17
    • good
    • 0
この回答へのお礼

できました!
教えてもらったのですが、
ORDER BY day + 0 ASC
でOKみたいです。
castの方法は結局分からないのですが、
charからintへの変換はでき、期待通りの出力が得られました。
intを文字列に直すとき + ""をするとできる(正規な方法ではないかもしれないですが)
のと同じですね。
order by 句でも使えるのは勉強になりました。

>それに、日付をchar(2)に格納するメリットを、あまり思いつかないのですが?
  そうですよね。
  tinyintとかにしてくれと頼んだほうがいいでしょうか・・
  幸い、このテーブルは自分しか使わないのですが、
  他の、日付を使う画面ではやはりchar型になっているのだと思います。
  本質的な方法ではないかもしれませんが、java側で対処することにします。
  ご回答ありがとうございました。

お礼日時:2007/10/26 17:17

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!