時間的な値を表す日付と時刻型は、DATETIME
、DATE
、TIMESTAMP
、TIME
、そして
YEAR
です。MySQL
が表すことのできない不正データを指示したときに利用される「ゼロ」値と同様に、各時刻型は有効値範囲を持ちます。TIMESTAMP
型には、後に紹介されますが、特別な更新機能があります。時刻型が必要とする記憶容量に関しては、項6.5. 「データ型のストレージ要件」
を参照してください。
MySQL
は不正データを挿入すると警告かエラーを発生させます。SQL
モードを適切な値に設定することで、MySQL
がサポートする日付の型を指定することができます。詳細は、Server SQL Modes
を参照してください。ALLOW_INVALID_DATES
SQL
モードを使用することにより、'2009-11-31'
のような一部の日付も MySQL
で受け入れることができます。これは、ユーザーが将来の処理のためにデータベースの中で指定した「間違っているかもしれない」値を格納したいときに便利です。このモードでは、MySQL
は指定された月が 0 から 12
の範囲にあることと、指定された日が 0 から 31
の範囲にあることしか確認しません。これらの範囲にゼロが含まれているのは、MySQL
では、DATE
または DATETIME
カラムの日の値または月日の値がゼロである日付の格納が許容されているためです。これは、誕生日など、正確な日付が不明なデータを格納する必要があるアプリケーションに大変便利です。この場合は、単に日付を
'2009-00-00'
または
'2009-01-00'
として格納します。このような日付を格納する場合は、DATE_SUB()
や DATE_ADD()
などの関数によって正しい結果が返されることを期待しないようにしてください。(もし日付にゼロを利用したくないのであれば、NO_ZERO_IN_DATE
SQL モードを利用することができます。
MySQL 5.1.18
よりも前のバージョンでは、DATE
値が DATETIME
値と比較されるときは、DATETIME
値の時刻部分が無視されます。そうしないと、比較が文字列の比較として行われる可能性があります。MySQL
5.1.18
以降のバージョンでは、DATE
値に時刻部分を
'00:00:00'
として追加することにより、強制的に
DATETIME
型にします。以前の動作を再現するには、CAST()
関数を使用して比較のオペランドが以前のように扱われるようにします。次に例を示します。
date_col
= CAST(NOW() AS DATE)
MySQL では、'0000-00-00'
を「ダミーの日付」として格納することもできます
(NO_ZERO_DATE
SQL
モードを使用していない場合)。これは、場合によっては
NULL
を使用するよりも便利です
(データとインデックスの容量が少なくて済みます)。
日付と時刻型を利用する際の注意事項があります。
MySQL は標準出力形式の中で入力された日付や時刻の値を検索しますが、提供された値に対して、いくつものフォーマットを読み取ろうとします。(たとえば、日付や時刻型に指定される、または比較される値を指定したとき)。次の節で紹介されているフォーマットだけがサポートされています。正当な値を提供しなければいけません。もしほかのフォーマットの値を使用すると、予期しない結果が出る可能性があります。
2 桁の年を含む日付の値は、世紀が不明なためあいまいです。MySQL は 2 桁の年の値を次の規則に従って解釈します。
70-99
の範囲の年の値は
1970-1999
に変換されます。
00-69
の範囲の年の値は
2000-2069
に変換されます。
MySQL
では値の解釈がいくつかの形式で試みられますが、日付は、ほかで一般的に使用されている月-日-年や日-月-年の順序
(たとえば、'09-04-98'
、'04-09-98'
)
ではなく、必ず年-月-日の順序
(たとえば、'98-09-04'
)
で入力する必要があります。
MySQL は、その値が数字で利用されれば、日付と時刻型の値を数字に変換し、またその反対も行います。
デフォルトでは、MySQL
に日付や時刻型の範囲外の値や、その型には不正なデータ(この節の始めで触れたように)が入力されたときは、その値を
「ゼロ」
に変換します。その例外は、範囲外の
TIME
値は
TIME
範囲の適切な終点にクリップされるということです。
次のテーブルに、それぞれの型の
「ゼロ」
値のフォーマットが表されています。NO_ZERO_DATE
SQL
モードが有効な場合は、これらの値を利用すると警告メッセージが表示されることを覚えておいてください。
Data Type | 「ゼロ」値 |
DATETIME |
'0000-00-00 00:00:00' |
DATE |
'0000-00-00' |
TIMESTAMP |
'0000-00-00 00:00:00' |
TIME |
'00:00:00' |
YEAR |
0000 |
「ゼロ」
値は特別ですが、テーブルに表されている値を利用して格納したり、正確に参照したりすることができます。また、このほかに、より簡単に記述できる値
'0'
や
0
も「ゼロ」値の格納または参照に使用できます。
MyODBC で利用される 「ゼロ」
の日付や時刻値は ODBC
では扱うことができないので、MyODBC 2.50.12
以前のバージョンでは自動的に
NULL
に変換されます。