竹形誠司 ブログ
Java+MySQL+Tomcat    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
MySQLの関数でlong値から日付フォーマットにデータを変換する
by 竹形 誠司[takegata]
SQLの日付関連関数は、方言が多くて覚えるのが大変です。なので、私はデータベースに日付情報を格納する場合は、JavaのDateオブジェクトからgetTime()メソッドで取得できるlong値を使うようにしています。このlong値は、1970年1月1日午前0時(グリニッジ標準時)を起点として、そこから何ミリ秒経ったかを表します。たとえば、2008年6月17日 20時40分48秒なら、1213702848000になります。

java.utilパッケージのDateクラスは、デフォルトのコンストラクタを呼び出すと、その時刻を表すオブジェクトが生成されます。つまり、

Date date = new Date();
long lngDate = date.getTime();
というコードでは、lngDateに現在の時刻を表すlong値が入ります。

また、引数にlong値を取るDateクラスのコンストラクタは、long値に相当する日付のオブジェクトを返します。たとえば、

Date date = new Date(1213702848000);
String strDate = date.toString();
というコードでは、strDateに「Tue Jun 17 20:40:48 JST 2008」という文字列が入ります。

このような形にしておけば、日付を7日後に設定したい場合でもただ単に7日×24時間×60分×60秒×1000ミリ秒=6048000000 を足せばよいことになります。これは、月をまたぐ場合(たとえば、2月25日から7日後に日付をセットする場合)に便利です。

ウェブ・アプリケーションなどでは、このlong値をデータベースに保存するわけですが、long値のままではどの日を表しているのか分かりにくいので、デバッグの際などには不便です。このような場合に使えるのが、MySQLの from_unixtime() という関数です。この関数はUNIXタイムを受け取って、文字列表記に変換します。UNIXタイムとは、1970年1月1日午前0時(グリニッジ標準時)を起点として、そこから何秒経ったかを表した値です。つまり、javaのlong値を1000で割ってfrom_unixtime()関数に渡せば、文字列表記に変換できるわけです。たとえば、logというテーブルに時刻をlong値で記録したtimeというカラムがあったとします。

mysql> select time from log;
+---------------+
| time          |
+---------------+
| 1213656032681 |
| 1213690624732 |
| 1213693606129 |
| 1213693606179 |
+---------------+
from_unixtime()関数を使って次のように表示することができます。

mysql> select from_unixtime(time/1000) from log;
+--------------------------+
| from_unixtime(time/1000) |
+--------------------------+
| 2008-06-17 07:40:33      |
| 2008-06-17 17:17:05      |
| 2008-06-17 18:06:46      |
| 2008-06-17 18:06:46      |
+--------------------------+
ミリ秒の桁は四捨五入されるようです。

投稿:竹形 誠司[takegata]/2008年 06月 17日 21時 52分 /更新:2011年 06月 02日 20時 09分