ある程度まで、ある時間型から別の時間型に値を変換できます。ただし、値の変更や情報の損失が生じることがあります。どの場合でも、時間型間の変換は、変換される型で有効な値の範囲に依存します。たとえば、DATE
、DATETIME
、および TIMESTAMP
値はすべて、同じセットの形式を使用して指定できますが、すべての型で値の範囲が同じであるわけではありません。TIMESTAMP
値は、1970
UTC より古い値にしたり、'2038-01-19 03:14:07'
UTC より新しい値にしたりできません。つまり、'1968-01-01'
などの日付は、DATE
または DATETIME
値としては有効ですが、TIMESTAMP
値としては有効ではなく、0
に変換されます。
DATE
値の変換:
DATE
値には時間情報が含まれないので、DATETIME
またはTIMESTAMP
値に変換すると、'00:00:00'
の時間部分が追加されます。TIME
値への変換は有用ではありません。結果は'00:00:00'
になります。
DATETIME
および TIMESTAMP
値の変換:
DATE
型には時間情報が含まれないので、DATE
値に変換すると時間部分が破棄されます。TIME
型には日付情報が含まれないので、TIME
値に変換すると日付部分が破棄されます。
TIME
値のほかの時間型への変換はバージョンによって異なります。
-
MySQL 5.6.4 以降では、
CURRENT_DATE()
の値が日付部分に使用されます。TIME
は (時間ではなく) 経過時間として解釈され、日付に追加されます。これは、時間値が'00:00:00'
から'23:59:59'
の範囲から外れている場合に、結果の日付部分が現在の日付と異なることを意味します。現在の日付が
'2012-01-01'
であるとします。'12:00:00'
、'24:00:00'
、'-12:00:00'
のTIME
値は、DATETIME
またはTIMESTAMP
値に変換されると、それぞれ'2012-01-01 12:00:00'
、'2012-01-02 00:00:00'
、'2011-12-31 12:00:00'
になります。TIME
からDATE
への変換も同様ですが、結果から時間部分が破棄され、それぞれ'2012-01-01'
、'2012-01-02'
、'2011-12-31'
になります。 5.6.4 より前の MySQL では、時間の文字列を日付または日付時間として解析することによって、時間値を日付または日付時間値に変換します。これが役立つ可能性はありません。たとえば、
'23:12:31'
は、日付として解釈されると'2023-12-31'
になります。日付として有効でない時間は'0000-00-00'
またはNULL
になります。
明示的な変換を使用して暗黙的な変換をオーバーライドできます。たとえば、DATE
および DATETIME
値の比較で、DATE
値は、'00:00:00'
の時間部分を追加することにより、強制的に DATETIME
型に変更されます。代わりに DATETIME
値の時間部分を無視して比較を実行するには、次の方法で CAST()
関数を使用します。
date_col = CAST(datetime_col AS DATE)
TIME
および DATETIME
値の数値形式への (+0
の追加などによる) 変換は、次のように行われます。
-
MySQL 5.6.4 以降では、
TIME(
またはN
)DATETIME(
は、N
)N
が 0 (または省略) の場合は整数に、N
が正の数の場合はN
の 10 進数を含むDECIMAL
値に変換されます。mysql> SELECT CURTIME(), CURTIME()+0, CURTIME(3)+0; +-----------+-------------+--------------+ | CURTIME() | CURTIME()+0 | CURTIME(3)+0 | +-----------+-------------+--------------+ | 09:28:00 | 92800 | 92800.887 | +-----------+-------------+--------------+ mysql> SELECT NOW(), NOW()+0, NOW(3)+0; +---------------------+----------------+--------------------+ | NOW() | NOW()+0 | NOW(3)+0 | +---------------------+----------------+--------------------+ | 2012-08-15 09:28:00 | 20120815092800 | 20120815092800.889 | +---------------------+----------------+--------------------+
-
MySQL 5.6.4 より前では、変換の結果は、マイクロ秒部分が
.000000
である倍精度値になります。mysql> SELECT CURTIME(), CURTIME()+0; +-----------+--------------+ | CURTIME() | CURTIME()+0 | +-----------+--------------+ | 09:28:00 | 92800.000000 | +-----------+--------------+ mysql> SELECT NOW(), NOW()+0; +---------------------+-----------------------+ | NOW() | NOW()+0 | +---------------------+-----------------------+ | 2012-08-15 09:28:00 | 20120815092800.000000 | +---------------------+-----------------------+