ある程度まで、ある時間型から別の時間型に値を変換できます。 ただし、値の変更や情報の損失が生じることがあります。 どの場合でも、時間型間の変換は、変換される型で有効な値の範囲に依存します。 たとえば、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
値への変換では、小数秒が考慮され、時間部分が丸められます。 たとえば、'1999-12-31 23:59:59.499'
は'1999-12-31'
になり、'1999-12-31 23:59:59.500'
は'2000-01-01'
になります。TIME
型には日付情報が含まれないので、TIME
値に変換すると日付部分が破棄されます。
TIME
値を他の時間型に変換する場合、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'
になります。
明示的な変換を使用して暗黙的な変換をオーバーライドできます。 たとえば、DATE
および DATETIME
値の比較で、DATE
値は、'00:00:00'
の時間部分を追加することにより、強制的に DATETIME
型に変更されます。 代わりに DATETIME
値の時間部分を無視して比較を実行するには、次の方法で CAST()
関数を使用します。
date_col = CAST(datetime_col AS DATE)
TIME
および DATETIME
値の数値形式への変換 (+0
の追加など) は、値に小数秒部分が含まれているかどうかによって異なります。 TIME(
または N
)DATETIME(
は、N
)N
が 0 (または省略) の場合は整数に変換され、N
が 0 より大きい場合は N
小数点を含む 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 |
+---------------------+----------------+--------------------+