時間値を表すための日付と時間型は、DATE
、TIME
, DATETIME
、TIMESTAMP
、および YEAR
です。それぞれの時間型には、一定範囲の有効な値のほかに、MySQL では表すことのできない無効な値の指定時に使用できる「ゼロ」値があります。TIMESTAMP
型には、後述するように、特殊な自動更新処理があります。時間型のストレージ要件については、セクション11.7「データ型のストレージ要件」を参照してください。
日付と時間型を処理するときに、次の考慮事項に留意してください。
MySQL は、標準出力形式で所定の日付または時間型の値を取得しますが、(たとえば、日付または時間型に割り当てたり、比較したりする値を指定するときに) 入力した入力値に対してさまざまな形式を解釈しようとします。日付と時間型に許可されている形式の説明については、セクション9.1.3「日付リテラルと時間リテラル」を参照してください。有効な値を入力する必要があります。ほかの形式で値を使用すると、予期しない結果が生じることがあります。
MySQL は、複数の形式で値を解釈しようとしますが、日付の部分は、ほかでは一般的に使用される月-日-年や日-月-年の順 (
'09-04-98'
や'04-09-98'
など) ではなく、年-月-日の順 ('98-09-04'
など) で常に指定する必要があります。-
2 桁の年を含む日付の値は、世紀が不明なためあいまいです。MySQL は次のルールを使用して 2 桁の年の値を解釈します。
70-99
の範囲の値は1970-1999
に変換されます。00-69
の範囲の値は2000-2069
に変換されます。
セクション11.3.8「日付での 2 桁の年」も参照してください。
ある時間型から別の時間型への値の変換は、セクション11.3.7「日付と時間型間での変換」でのルールに従って行われます。
MySQL は自動的に、値が数値のコンテキストで使用される場合には日付または時間値を数値に、またはその反対に変換します。
デフォルトで MySQL は、日付または時間型の値で、範囲外であるか、それ以外で型にとって無効である値を見つけた場合、値をその型の「ゼロ」値に変換します。その例外では、範囲外の
TIME
値はTIME
範囲の適切な終点に切り落とされます。SQL モードを適切な値に設定することで、MySQL がサポートする日付の種類をより正確に指定できます。(セクション5.1.7「サーバー SQL モード」を参照してください。)
ALLOW_INVALID_DATES
SQL モードを有効にすることによって、'2009-11-31'
などの特定の日付を MySQL に受け入れさせることができます。これは、ユーザーが今後の処理のために、(たとえば Web フォームで) 指定した「間違っている可能性のある」値をデータベースに格納するときに役立ちます。このモードでは、MySQL は、月が 1 から 12 までの範囲にあることと、日付が 1 から 31 までの範囲にあることのみ検証します。MySQL では、
DATE
またはDATETIME
カラムに、日がゼロ、または月および日がゼロである日付の格納を許可しています。これは、正確な日付がわかっていない可能性のある生年月日を格納する必要があるアプリケーションで役立ちます。この場合は、単に日付を'2009-00-00'
または'2009-01-00'
として格納します。このような日付を格納する場合は、DATE_SUB()
やDATE_ADD()
などの完全な日付を必要とする関数で正しい結果が返されることは期待しないでください。日付でゼロの月または日の部分を無効にするには、NO_ZERO_IN_DATE
SQL モードを有効にします。MySQL では、「ダミーの日付」として
'0000-00-00'
の「ゼロ」の値を格納できます。場合によっては、これは、NULL
値を使用するよりも便利であり、使用するデータおよびインデックススペースが少なくなります。'0000-00-00'
を無効にするには、NO_ZERO_DATE
SQL モードを有効にします。Connector/ODBC で使用される「ゼロ」の日付または時間の値は、ODBC がこのような値を処理できないため、
NULL
に自動的に変換されます。
次の表に、それぞれの型の「ゼロ」値の形式を示します。「ゼロ」値は特別ですが、表に示されている値を使用して、格納したり、明示的に参照したりできます。また、より簡単に記述できる '0'
や 0
の値を使用してこれを行うこともできます。日付部分 (DATE
、DATETIME
、および TIMESTAMP
) を含む時間型では、NO_ZERO_DATE
SQL モードが有効な場合、これらの値を使用すると警告が発生します。
データ型 | 「ゼロ」値 |
---|---|
DATE |
'0000-00-00' |
TIME |
'00:00:00' |
DATETIME |
'0000-00-00 00:00:00' |
TIMESTAMP |
'0000-00-00 00:00:00' |
YEAR |
0000 |