2012年7月5日木曜日

MySQLで多様な日付形式が簡単に!

日本語アプリケーションと非日本語アプリケーションの両方を扱っているとき悩むことの一つが日付の表現ですね。
私としては、「20●●年●●月●●日(曜)」という表現が、とてもいいと感じています。一目で年月日と曜日が分かりますからね。
ところが、これを簡単にアプリに作り込むことって案外大変なのです。

日付属性のデータを何らかのフォーマットに変換して表示しなければなりません。たとえばMsAccessのフォーム上のコントロールに日付属性のデータフィールドをリンクさせ、書式を設定して上げるというのが、一般的な手法だと思います。

でも、わたしは先日もっと簡単な方法を思いつき実践してみました。とても簡単です。
それは多様で豊富なMySQLのdate_format関数とsubstring関数を組み合わせて使うことです。下にSQL文の例を具体的に上げましょう。



select 
concat(
date_format(max(日付),'%Y年%m月%d日')
,'('
,substring('月火水木金土日',convert(date_format(max(日付),'%w'),char),1)
,')'
)
as 日付表示
from 日付を含むテーブル;


このでのミソは「(曜)」の部分の曜日を漢字1文字で表現するために下記の関数を工夫したことです。
substring('月火水木金土日',convert(date_format(max(日付),'%w'),char),1)


ちなみに、substring関数は2バイト文字にちゃんと対応してくれるので便利です。
あとは曜日の一文字で示す文字列'月火水木金土日'のなかから曜日番号date_format(max(日付)に相当する位置にある文字を取り出すだけです。


なお、convert曜日番号を文字列に変換する部分もキモです。不思議におもわれるかも知れませんが、実験結果これをしないと正しくsubstring関数が動きませんでした。


MySQLの関数の豊富さ、扱いやすさには脱帽ですね。でも、実験で確かめないと思い通りに動かない場合がありますからお互いに学習成果を発表して理解を共有することが大切だと思います。この記事も、その実践例のひとつです。