DATETIME
、DATE
、そして
TIMESTAMP
タイプは関連しています。このセクションでは、それらがどのように似ているのか、そしてどのような点で異なっているのかなどの、特徴について説明しています。
DATETIME
タイプは、日付と時刻の両方の情報を含む値が必要な時に利用します。MySQLは、DATETIME
値を 'YYYY-MM-DD HH:MM:SS'
のフォーマットで検索、表示します。サポートされている範囲は
'1000-01-01 00:00:00'
から
'9999-12-31 23:59:59'
です。
DATE
タイプは時刻の部分は無く、日付の値だけが必要な時に利用します。MySQLは、DATE
値を 'YYYY-MM-DD'
のフォーマットで検索、表示します。サポートされている範囲は
'1000-01-01'
から
'9999-12-31'
です。
DATETIME
と DATE
範囲の説明では、「サポートする」というのは、以前の値が有効であったとしても、その保障は無いという意味になります。
TIMESTAMP
データタイプは、MySQLのバージョンと、そのサーバーが稼動しているSQLモードによって様々な性質を持っています。これらの性質は、このセクションの後のほうで説明します。
DATETIME
、DATE
、そして
TIMESTAMP
値を、フォーマットの共通セットを利用して、指定する事ができます。
'YYYY-MM-DD HH:MM:SS'
か
'YY-MM-DD HH:MM:SS'
フォーマットの文字列として。「柔軟な」
構文が許可されています。句読点文字が、日付部分と時刻部分の区切り文字として利用される事があります。例えば、'98-12-31
11:30:45'
、'98.12.31
11+30+45'
、 '98/12/31
11*30*45'
、そして '98@12@31
11^30^45'
は同等です。
'YYYY-MM-DD'
か
'YY-MM-DD'
フォーマットの文字列として。「柔軟な」
構文がここでも許可されています。例えば、'98-12-31'
、'98.12.31'
、
'98/12/31'
、そして'98@12@31'
は同等です。
文字列が日付として成り立つという条件で、
'YYYYMMDDHHMMSS'
か
'YYMMDDHHMMSS'
フォーマットの区切り文字が無い文字列として。例えば、'19970523091528'
と '970523091528'
は
'1997-05-23
09:15:28'
を表しますが、'971122129015'
は不正データで、(これは意味を成さない分の部分がある為)'0000-00-00
00:00:00'
となります。
文字列が日付として成り立つという条件で、'YYYYMMDD'
か 'YYMMDD'
フォーマットの区切り文字が無い文字列として。例えば、'19970523'
と '970523'
は
'1997-05-23'
を表しますが、'971332'
は不正データで、(これは意味を成さない月と日の部分がある為)'0000-00-00'
となります。
文字列が日付として成り立つという条件で、YYYYMMDDHHMMSS
か YYMMDDHHMMSS
フォーマットの数字として。例えば、19830905132800
と 830905132800
は
'1983-09-05 13:28:00'
という意味になります。
文字列が日付として成り立つという条件で、YYYYMMDD
か YYMMDD
フォーマットの数字として。例えば、19830905
と 830905
は '1983-09-05
という意味になります。
NOW()
や CURRENT_DATE
のような、DATETIME
、
DATE
、または
TIMESTAMP
コンテキストで許容可能な値を戻す関数の結果。
不正な
DATETIME
、DATE
、または
TIMESTAMP
値は、適切なタイプ
('0000-00-00 00:00:00'
か
'0000-00-00'
)の
「ゼロ」 値に変換されます。
日にち部分の区切り文字を含む文字列として指定された値には、月か日にちの値に
10
以下の2桁の値を指定する必要はありません。'1979-6-9'
は '1979-06-09'
と同じです。同じように、時刻部分の区切り文字を含む文字列として指定された値には、時、分、または秒の値に
10
以下の2桁の値を指定する必要はありません。'1979-10-30
1:2:3'
は '1979-10-30
01:02:03'
と同じです。
数字として指定された値は、6、8、12、または14桁の長さである必要があります。もし数字が8、または14桁の長さなら、それはYYYYMMDD
か YYYYMMDDHHMMSS
フォーマットであり、年は最初の4桁で表されていると仮定されます。もしその数字が6、または12桁であれば、YYMMDD
か YYMMDDHHMMSS
フォーマットであり、年は最初の2桁で表されていると仮定されます。これらの長さではない数字は後ろがゼロで詰められ、これらの中の一番近い桁数と仮定して判断されます。
区切り文字が無い文字列として指定された値はそれ自体の長さのまま判断されます。もしその文字列が8か14文字なら、年は最初の4文字で表されていると判断されます。そうでなければ、年は最初の2文字で表されていると判断されます。文字列は、左から右に順番に、年、月、日、時、分、そして秒として、その文字列に存在する限りの情報が読み取られます。これは、6文字以下の文字列は利用してはいけないという事を意味します。例えば、もし1999年3月を表そうとして
'9903'
と指定すると、MySQLは日付の値に
「ゼロ」 を挿入します。年と月の値は
99
と 03
ですが、日付の部分が全く無いのでこのような事が起こります。ですので、この値は不当な値という事になります。しかし、欠落している月や日付の部分をゼロの値を使って明確に指定する事ができます。例えば、'1999-03-00'
という値を挿入する為に、'990300'
を利用する事ができます。
1つの日付タイプの値を異なる日付タイプのオブジェクトに割り当てる事がある程度可能です。しかし、値の変更や情報の損失などが起こる可能性があります。
もし DATE
値を
DATETIME
か TIMESTAMP
オブジェクトに割り当てると、DATE
値は時刻の情報を持たないので、その結果の時刻の部分は
'00:00:00'
に設定されます。
もし DATETIME
か
TIMESTAMP
値を DATE
オブジェクトに割り当てると、DATE
値は時刻の情報を格納しないので、その結果の時刻の部分は
削除されます。
DATETIME
、DATE
、そして
TIMESTAMP
値は、全て同じフォーマットの組み合わせを利用して指定する事ができますが、それらのタイプは全て同じ範囲の値を持つわけではない事を覚えておいてください。例えば、TIMESTAMP
値は 1970
以前や、2037
以降にはなり得ないという事です。これは、'1968-01-01'
のような日付は、DATETIME
や
DATE
値としては有効ですが、TIMESTAMP
値としては無効で、0
に変換されるという意味になります。
日付値を指定する時には、特定の落とし穴に気をつけてください。
文字列として指定された値に許容される柔軟なフォーマットはまぎらわしい事があります。例えば、'10:11:12'
のような値は‘:
’
が有る為に時刻値のように見えます。しかし、もし区切り文字が日付のコンテキストで利用されると、'2010-11-12'
のように年として解釈されます。'10:45:15'
値は、'45'
が正しい月を表す値ではないので、'0000-00-00'
に変換されます。
サーバは、それぞれが1から12、または1から31である事はもちろん、月と日の値が正しい値であることを要求します。ストリクトモードが無効の時は、'2004-04-31'
のような無効な日付は
'0000-00-00'
に変換され、警告メッセージが表示されます。ストリクトモードが有効な時は、無効な日付はエラーを発生させます。そのような日付を許容するには、ALLOW_INVALID_DATES
を有効にしてください。詳細については、項4.2.6. 「SQL モード」
をご参照ください。
2桁の年を含む日付の値は、世紀が不明な為あいまいです。MySQLは2桁の年の値を次のルールに従って解釈します。
00-69
の範囲の年の値は
2000-2069
に変換されます。
70-99
の範囲の年の値は
1970-1999
に変換されます。