時間データ型のサマリーについて説明します。時間型のプロパティーおよびストレージ要件の追加情報については、セクション11.3「日付と時間型」およびセクション11.7「データ型のストレージ要件」を参照してください。時間値を演算する関数の説明については、セクション12.7「日付および時間関数」を参照してください。
DATE
および DATETIME
範囲の説明では、「サポートされている」とは、以前の値は機能するが、保証はないことを意味します。
MySQL 5.6.4 以降では、マイクロ秒 (6 桁) までの精度を持つ TIME
、DATETIME
、および TIMESTAMP
値の小数秒に対応できるようになりました。小数秒部を含むカラムを定義するには、
の構文を使用します。ここで、type_name
(fsp
)type_name
は TIME
、DATETIME
、または TIMESTAMP
であり、fsp
は小数秒の精度です。例:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
fsp
値を指定する場合、0 から 6 の範囲にする必要があります。0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。(これは、以前の MySQL バージョンと互換性を保つため、標準 SQL のデフォルトである 6 とは異なっています。)
MySQL 5.6.5 には、時間型の拡張された自動初期化および更新機能が導入されました。テーブルごとに最大 1 つのカラムではなく、テーブル内のすべての TIMESTAMP
カラムにこれらのプロパティーを割り当てられます。さらに、これらのプロパティーは、DATETIME
カラムで使用できるようになりました。
YEAR(2)
データ型には、使用する前に考慮する必要のある特定の問題があります。MySQL 5.6.6 以降、YEAR(2)
は非推奨です。既存のテーブル内の YEAR(2)
カラムは以前のとおりに扱われますが、新規または変更したテーブルでは YEAR(2)
は YEAR(4)
に変換されます。詳細は、セクション11.3.4「YEAR(2) の制限と YEAR(4) への移行」を参照してください。
-
日付です。サポートしている範囲は
'1000-01-01'
から'9999-12-31'
です。MySQL は'YYYY-MM-DD'
の形式でDATE
値を表示しますが、文字列または数値のどちらかを使用したDATE
カラムへの値の割り当てを許可しています。 -
日付と時間の組み合わせです。サポートしている範囲は
'1000-01-01 00:00:00.000000'
から'9999-12-31 23:59:59.999999'
です。MySQL は、'YYYY-MM-DD HH:MM:SS[.fraction]'
の形式でDATETIME
値を表示しますが、文字列または数値のどちらかを使用したDATETIME
カラムへの値の割り当てを許可しています。MySQL 5.6.4 以降では、小数秒の精度を指定するために 0 から 6 の範囲でオプションの
fsp
値を指定できます。0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。MySQL 5.6.5 以降、
DATETIME
カラムに対する自動初期化および現在の日時への自動更新は、セクション11.3.5「TIMESTAMP および DATETIME の自動初期化および更新機能」で説明しているように、DEFAULT
およびON UPDATE
カラム定義句を使用して指定できます。 -
タイムスタンプです。範囲は
'1970-01-01 00:00:01.000000'
UTC から'2038-01-19 03:14:07.999999'
UTC です。TIMESTAMP
値は、エポック ('1970-01-01 00:00:00'
UTC) からの秒数として格納されます。TIMESTAMP
は、'1970-01-01 00:00:00'
という値を表すことはできません。これは、エポックからの秒数が 0 であることと同等で、0 という値は'0000-00-00 00:00:00'
、つまり「ゼロ」のTIMESTAMP
値を表すために予約されているからです。MySQL 5.6.4 以降では、小数秒の精度を指定するために 0 から 6 の範囲でオプションの
fsp
値を指定できます。0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。サーバーで
TIMESTAMP
定義をどのように扱うかは、explicit_defaults_for_timestamp
システム変数の値によって異なります (セクション5.1.4「サーバーシステム変数」を参照してください)。デフォルトでは、explicit_defaults_for_timestamp
は無効であり、サーバーは次のようにTIMESTAMP
を扱います。特に指定されていないかぎり、テーブル内の最初の
TIMESTAMP
カラムは、明示的に値が割り当てられていなければもっとも新しい変更の日時に自動的に設定されるように定義されています。これにより、TIMESTAMP
は、INSERT
またはUPDATE
操作のタイムスタンプの記録に役立ちます。NULL
値を許可するようにNULL
属性で定義されていないかぎり、NULL
値を割り当てることによって、すべてのTIMESTAMP
カラムを現在の日付と時間に設定することもできます。自動初期化および現在の日付と時間への自動更新は、
DEFAULT CURRENT_TIMESTAMP
およびON UPDATE CURRENT_TIMESTAMP
カラム定義句を使用して指定できます。デフォルトでは、前述のように最初のTIMESTAMP
カラムにこれらのプロパティーが含まれます。MySQL 5.6.5 以降では、テーブル内のどのTIMESTAMP
カラムでもこれらのプロパティーを割り当てるように定義できます。5.6.5 より前では、これらを割り当てられるTIMESTAMP
カラムはテーブルごとに最大 1 つにかぎられますが、最初のカラムでは抑制し、代わりに別のTIMESTAMP
カラムに割り当てることが可能です。セクション11.3.5「TIMESTAMP および DATETIME の自動初期化および更新機能」を参照してください。explicit_defaults_for_timestamp
が有効な場合、すべてのTIMESTAMP
カラムへのDEFAULT CURRENT_TIMESTAMP
またはON UPDATE CURRENT_TIMESTAMP
属性の自動的な割り当ては行われません。これらはカラム定義に明示的に含める必要があります。また、NOT NULL
として明示的に宣言されていないすべてのTIMESTAMP
は、NULL
値を許可します。explicit_defaults_for_timestamp
は、MySQL 5.6.6 以降で使用できます。5.6.6 より前では、サーバーは、explicit_defaults_for_timestamp
が無効の場合について説明したようにTIMESTAMP
を扱います。これらの動作は、デフォルトのままになっていますが、標準外であり、5.6.6 以降では非推奨です。explicit_defaults_for_timestamp
を有効化したインストールのアップグレードに関する説明については、セクション2.11.1.3「MySQL 5.5 から 5.6 へのアップグレード」を参照してください。 -
時間です。範囲は、
'-838:59:59.000000'
から'838:59:59.000000'
です。MySQL は、'HH:MM:SS[.fraction]'
形式でTIME
値を表示しますが、文字列または数値のどちらかを使用したTIME
カラムの値への割り当てを許可します。MySQL 5.6.4 以降では、小数秒の精度を指定するために 0 から 6 の範囲でオプションの
fsp
値を指定できます。0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。 -
2 桁または 4 桁の形式の年です。デフォルトは 4 桁の形式です。
YEAR(2)
とYEAR(4)
は表示形式が違いますが、値の範囲は同じです。4 桁の形式では、値は1901
から2155
と0000
として表示されます。2 桁の形式では、値は70
から69
として表示され、1970 から 2069 の年を表します。MySQL では、YEAR
値はYYYY
またはYY
の形式で表示されますが、文字列または数値を使用してYEAR
カラムに値を割り当てられます。注記YEAR(2)
データ型には、使用する前に考慮する必要のある特定の問題があります。MySQL 5.6.6 以降、YEAR(2)
は非推奨です。既存のテーブル内のYEAR(2)
カラムは以前のとおりに扱われますが、新規または変更したテーブルではYEAR(2)
はYEAR(4)
に変換されます。詳細は、セクション11.3.4「YEAR(2) の制限と YEAR(4) への移行」を参照してください。入力値の
YEAR
の表示形式および解釈に関する追加情報については、セクション11.3.3「YEAR 型」を参照してください。
SUM()
および AVG()
集計関数は時間値を扱いません。(これらは値を数字に変換するので、最初の数字以外の文字のあとのすべての情報が失われます。)この問題を回避するには、数値単位に変換し、集計操作を実行してから、時間値に戻します。例:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
MySQL Server は、MAXDB
SQL モードを有効にして実行できます。この場合、TIMESTAMP
は DATETIME
と同じです。テーブルの作成時にこのモードが有効になっている場合、TIMESTAMP
カラムは DATETIME
カラムとして作成されます。その結果、このようなカラムでは DATETIME
表示形式が使用され、値の範囲は同じになり、自動初期化や現在の日付と時間への自動更新は行われなくなります。セクション5.1.7「サーバー SQL モード」を参照してください。