<< トップページへ

<< 目次へ

更新日:2013.4.29

小技集・豆知識

日付データへの変換



 MySQLで「日付」の操作を行うことがよくあります。例えば、顧客の購買履歴のデータから「基準日からの直近購買日までの日数」などを計算することがあります。MySQLには以下に示す4つのデータ型が用意されています。

 データマイニング業務において、実質的に取り扱うことが多いのは「DATE型」のみといってもよいでしょう。データとしてDATETIME型として保持しているケースもありますが、時間単位(HH:MI:SS)でデータを保持していても、使用するのはほぼ日付単位(YYY-MM-DD)での情報だからです。

 場合によっては文字型として日付のデータを保持している(データテーブルに読み込まれている)ケースがあります。その場合には「文字型を日付型(DATE型やDATETIME型)に変換」する必要がでてきます。その方法を紹介していきましょう。


■CAST関数による日付型への変換

 最もてっとり早く日付型へ変換する方法がCAST関数を用いることである。CAST関数は非常に便利な関数で、使い勝手もよいのでおススメである。

 
#### CAST関数の使い方
CAST('日付を表す文字列' as DATE)     # DATEをDATETIMEとすることも可能



## 20090823という文字列をDATE型に変換
select cast('20090823' as date);

mysql> select cast('20090823' as date);
+--------------------------+
| cast('20090823' as date) |
+--------------------------+
| 2009-08-23               |
+--------------------------+


## 20090823という文字列をDATETIME型に変換
select cast('20090823' as datetime);

mysql> select cast('20090823' as datetime);
+------------------------------+
| cast('20090823' as datetime) |
+------------------------------+
| 2009-08-23 00:00:00          |     ←【注】時間単位(HH:MI:SS)の情報は全て0になる
+------------------------------+


## '2009-08-23 11:20:00'をDATETIME型に変換
select cast('2009-08-23 11:20:00' as datetime);

mysql> select cast('2009-08-23 11:20:00' as datetime);
+-----------------------------------------+
| cast('2009-08-23 11:20:00' as datetime) |
+-----------------------------------------+
| 2009-08-23 11:20:00                     |
+-----------------------------------------+


## '2009-08-23 11:20:00'をDATE型に変換
select cast('2009-08-23 11:20:00' as date);

mysql> select cast('2009-08-23 11:20:00' as date);
+-------------------------------------+
| cast('2009-08-23 11:20:00' as date) |
+-------------------------------------+
| 2009-08-23                          |    ←【注】時間単位(HH:MI:SS)の情報は切り捨てられる
+-------------------------------------+
 

 なお余談だが、CAST関数を用いる際に指定できる「日付を表す文字列」にはいくつかのバリエーションに対応できるようになっている。ただしDATE型へ変換する際とDATETIME型へ変換する際とで、若干の動作が異なる点に注意すべきである。

 
#### 【DATE型への変換の場合】

## 固定桁の文字列はOK
mysql> select cast('20090823' as date);
+--------------------------+
| cast('20090823' as date) |
+--------------------------+
| 2009-08-23               |
+--------------------------+


## ハイフンつなぎもOK
mysql> select cast('2009-08-23' as date);
+----------------------------+
| cast('2009-08-23' as date) |
+----------------------------+
| 2009-08-23                 |
+----------------------------+


## スラッシュつなぎもOK
mysql> select cast('2009/08/23' as date);
+----------------------------+
| cast('2009/08/23' as date) |
+----------------------------+
| 2009-08-23                 |
+----------------------------+


## カンマつなぎもOK
mysql> select cast('2009,08,23' as date);
+----------------------------+
| cast('2009,08,23' as date) |
+----------------------------+
| 2009-08-23                 |
+----------------------------+


## 年月日つがぎはNG(ただし後に紹介するSTR_TO_DATE関数なら可)
mysql> select cast('2009年08月23日' as date);
+--------------------------------+
| cast('2009年08月23日' as date) |
+--------------------------------+
| NULL                           |
+--------------------------------+



#### 【DATETIME型への変換の場合】

# DATETIME型への変換も同様にできるが、以下の例はNG
mysql> select cast('20090823 11:20:00' as datetime);
+---------------------------------------+
| cast('20090823 11:20:00' as datetime) |
+---------------------------------------+
| NULL                                  |     ←年月日が固定桁だとNG
+---------------------------------------+
 


■STR_TO_DATE関数による日付型への変換

 関数としての機能はほぼ同じであるが、STR_TO_DATE関数を使うことでより細かい変換に対応することができる。

 
#### STR_TO_DATEの基本的な使い方


## 固定桁の文字列をDATE型に変換
select str_to_date('20090823', '%Y%m%d');

mysql> select str_to_date('20090823', '%Y%m%d');
+-----------------------------------+
| str_to_date('20090823', '%Y%m%d') |     ←%Y:Year, %m:month, %d:day
+-----------------------------------+
| 2009-08-23                        |     ←cast('20090823' as date)と同じ
+-----------------------------------+


## 【注意】大文字と小文字は区別されている

mysql> select str_to_date('20090823', '%Y%M%d');
+-----------------------------------+
| str_to_date('20090823', '%Y%M%d') |
+-----------------------------------+
| NULL                              |     ←%Mではなく、%mにしないとダメ
+-----------------------------------+




## 上記以外にもハイフン(-),スラッシュ(/),カンマ(,)に対応している
##  STR_TO_DATE()ではさらに以下のようなケースにも対応できる

select str_to_date('2009年8月23日', '%Y年%m月%d日');

mysql> select str_to_date('2009年8月23日', '%Y年%m月%d日');
+----------------------------------------------+
| str_to_date('2009年8月23日', '%Y年%m月%d日') |
+----------------------------------------------+
| 2009-08-23                                   |     ←年・月・日で区切られた文字列に対応
+----------------------------------------------+


select str_to_date('August 23,2009', '%M %d,%Y');

mysql> select str_to_date('August 23,2009', '%M %d,%Y');
+-------------------------------------------+
| str_to_date('August 23,2009', '%M %d,%Y') |
+-------------------------------------------+
| 2009-08-23                                |     ←英表記の文字列にも対応
+-------------------------------------------+


## 【注意】大文字と小文字は区別されている

mysql> select str_to_date('August 23,2009', '%m %d,%Y');
+-------------------------------------------+
| str_to_date('August 23,2009', '%m %d,%Y') |
+-------------------------------------------+
| NULL                                      |     ←%mではなく、%Mにしないとダメ
+-------------------------------------------+
 

 上記の例において「%m」と「%M」はMySQLで指定子と呼ばれるものであある。%mは「月の数字」を表すもので、%Mは「月名」を指定するものである。そのためstr_to_date('20090823', '%Y%M%d')は間違いである(ここでは[08]という月の数字であるので%mにしなければならない)。一方でstr_to_date('August 23,2009', '%m %d,%Y')も間違いである(ここでは[August]という月名であるので%Mにしなければならない)。

 以下にMySQLの指定子の一覧を示す。

指定子 解説
%a 簡略曜日名 (Sun..Sat)
%b 簡略月名 (Jan..Dec)
%c 月、数字 (0..12)
%D 英語の接尾辞を持つ日にち (0th, 1st, 2nd, 3rd, …)
%d 日にち、数字 (00..31)
%e 日にち、数字 (0..31)
%f マイクロ秒 (000000..999999)
%H 時間 (00..23)
%h 時間 (01..12)
%I 時間 (01..12)
%i 分、数字 (00..59)
%j 通日 (001..366)
%k 時間 (0..23)
%l 時間 (1..12)
%M 月名 (January..December)
%m 月、数字 (00..12)
%p AM または PM
%r 時間、12 時間単位 (hh:mm:ss に AM または PM が続く )
%S 秒 (00..59)
%s 秒 (00..59)
%T 時間、24 時間単位 (hh:mm:ss)
%U 週 (00..53) 、週の開始は日曜日
%u 週 (00..53)、週の開始は月曜日
%V 週 (01..53) 、週の開始は日曜日で、%X と使用
%v 週 (01..53) 、週の開始は月曜日で、%x と使用
%W 曜日名 (Sunday..Saturday)
%w 曜日 (0=Sunday..6=Saturday)
%X 年間の週、週の始まりは日曜日、週、数字、4 桁 ; %V と使用
%x 年間の週、週の始まりは月曜日、数字、4 桁、%v と使用
%Y 年、数字、4 桁
%y 年、数字 ( 2 桁 )
%% リテラル ‘%’ 文字
%x x 、上記にないすべての ‘x’
http://dev.mysql.com/doc/refman/5.1/ja/date-and-time-functions.htmlより引用。