SQLの日付関連関数は、方言が多くて覚えるのが大変です。なので、私はデータベースに日付情報を格納する場合は、JavaのDateオブジェクトからgetTime()メソッドで取得できるlong値を使うようにしています。このlong値は、1970年1月1日午前0時(グリニッジ標準時)を起点として、そこから何ミリ秒経ったかを表します。たとえば、2008年6月17日 20時40分48秒なら、1213702848000になります。
java.utilパッケージのDateクラスは、デフォルトのコンストラクタを呼び出すと、その時刻を表すオブジェクトが生成されます。つまり、
また、引数にlong値を取るDateクラスのコンストラクタは、long値に相当する日付のオブジェクトを返します。たとえば、
このような形にしておけば、日付を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というカラムがあったとします。
java.utilパッケージのDateクラスは、デフォルトのコンストラクタを呼び出すと、その時刻を表すオブジェクトが生成されます。つまり、
Date date = new Date();
long lngDate = date.getTime();
というコードでは、lngDateに現在の時刻を表すlong値が入ります。long lngDate = date.getTime();
また、引数にlong値を取るDateクラスのコンストラクタは、long値に相当する日付のオブジェクトを返します。たとえば、
Date date = new Date(1213702848000);
String strDate = date.toString();
というコードでは、strDateに「Tue Jun 17 20:40:48 JST 2008」という文字列が入ります。String strDate = date.toString();
このような形にしておけば、日付を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()関数を使って次のように表示することができます。+---------------+
| time |
+---------------+
| 1213656032681 |
| 1213690624732 |
| 1213693606129 |
| 1213693606179 |
+---------------+
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 |
+--------------------------+
ミリ秒の桁は四捨五入されるようです。+--------------------------+
| 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分