Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  日付と時間型間での変換

11.3.7 日付と時間型間での変換

ある程度まで、ある時間型から別の時間型に値を変換できます。ただし、値の変更や情報の損失が生じることがあります。どの場合でも、時間型間の変換は、変換される型で有効な値の範囲に依存します。たとえば、DATEDATETIME、および 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 |
    +---------------------+-----------------------+

User Comments
Sign Up Login You must be logged in to post a comment.