[+/-]
時間的な値を表す日付と時刻タイプは、DATETIME
、DATE
、TIMESTAMP
、
TIME
、そして YEAR
です。MySQLが表す事のできない不正データを指示した時に利用される「ゼロ」値と同様に、各時刻タイプは有効値範囲を持ちます。TIMESTAMP
タイプには、後に紹介されますが、特別な更新機能があります。時刻タイプが必要とする記憶容量に関しては、項10.5. 「データタイプが必要とする記憶容量」
を参照してください。
MySQLは不正データを挿入すると警告かエラーを発生させます。SQLモードを適切な値に設定する事で、MySQLがサポートする日付のタイプを指定する事ができます。(詳しくは
項4.2.6. 「SQL モード」
をご確認ください。)ALLOW_INVALID_DATES
SQLモードを利用する事によって、'1999-11-31'
のような確実な日付をMySQLに指定する事ができます。これは、ユーザーが将来の処理の為にデータベースの中で指定した「間違っているかもしれない」値を格納したい時に便利です。このモードの時MySQLは、月は0から12の範囲、日付は0から31の範囲でしか確認しません。MySQLが
DATE
か DATETIME
カラムの中で日付、または月と日付がゼロであるデータの格納を許可するので、これらの範囲はゼロを含むと定義されています。これは、誕生日など、正確な日付が不明なデータを格納する必要があるアプリケーションに大変便利です。その場合は、'1999-00-00'
や '1999-01-00'
等のようにデータを格納するだけでよいのです。このようなデータを格納する時は、DATE_SUB()
や DATE_ADD
など、正確な日付を必要とする物のように、正確な結果を期待する事はできません。(もし日付にゼロを利用したくないのであれば、NO_ZERO_IN_DATE
SQLモードを利用する事ができます。)
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モードが有効な場合は、これらの値を利用すると警告メッセージが表示される事を覚えておいて下さい。
データタイプ | 「ゼロ」 値 |
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
に変換されます。