時間値を表すための日時データ型は、DATE
, TIME
, DATETIME
, TIMESTAMP
および YEAR
です。
DATE
および DATETIME
範囲の説明では、「サポートされている」とは、以前の値は機能するが、保証はないことを意味します。
MySQL では、マイクロ秒 (6 桁) までの精度で、TIME
、DATETIME
および TIMESTAMP
の値に小数秒を使用できます。 小数秒部を含むカラムを定義するには、
の構文を使用します。ここで、type_name
(fsp
)type_name
は TIME
、DATETIME
、または TIMESTAMP
であり、fsp
は小数秒の精度です。 例:
CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
fsp
値を指定する場合、0 から 6 の範囲にする必要があります。 0 の値は、小数部がないことを表します。 省略した場合、デフォルトの精度は 0 です。 (これは、以前の MySQL バージョンと互換性を保つため、標準 SQL のデフォルトである 6 とは異なっています。)
テーブル内の TIMESTAMP
または DATETIME
カラムには、自動初期化および自動更新プロパティを設定できます。セクション11.2.5「TIMESTAMP および DATETIME の自動初期化および更新機能」 を参照してください。
-
日付です。 サポートしている範囲は
'1000-01-01'
から'9999-12-31'
です。 MySQL では、DATE
値は'
形式で表示されますが、文字列または数値を使用したYYYY-MM-DD
'DATE
カラムへの値の割当ては許可されます。 -
日付と時間の組み合わせです。 サポートしている範囲は
'1000-01-01 00:00:00.000000'
から'9999-12-31 23:59:59.999999'
です。 MySQL では、DATETIME
値は'
形式で表示されますが、文字列または数値を使用したYYYY-MM-DD hh:mm:ss
[.fraction
]'DATETIME
カラムへの値の割当ては許可されます。小数秒精度を指定するには、0 から 6 の範囲のオプションの
fsp
値を指定できます。 0 の値は、小数部がないことを表します。 省略した場合、デフォルトの精度は 0 です。セクション11.2.5「TIMESTAMP および DATETIME の自動初期化および更新機能」 で説明されているように、
DEFAULT
およびON UPDATE
のカラム定義句を使用して、DATETIME
カラムの現在の日時への自動初期化および更新を指定できます。 -
タイムスタンプです。 範囲は
'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
値を表すために予約されているからです。小数秒精度を指定するには、0 から 6 の範囲のオプションの
fsp
値を指定できます。 0 の値は、小数部がないことを表します。 省略した場合、デフォルトの精度は 0 です。サーバーで
TIMESTAMP
定義をどのように扱うかは、explicit_defaults_for_timestamp
システム変数の値によって異なります (セクション5.1.8「サーバーシステム変数」を参照してください)。explicit_defaults_for_timestamp
が有効な場合、すべてのTIMESTAMP
カラムへのDEFAULT CURRENT_TIMESTAMP
またはON UPDATE CURRENT_TIMESTAMP
属性の自動的な割り当ては行われません。 これらはカラム定義に明示的に含める必要があります。 また、NOT NULL
として明示的に宣言されていないすべてのTIMESTAMP
は、NULL
値を許可します。explicit_defaults_for_timestamp
が無効になっている場合、サーバーは次のようにTIMESTAMP
を処理します:特に指定されていないかぎり、テーブル内の最初の
TIMESTAMP
カラムは、明示的に値が割り当てられていなければもっとも新しい変更の日時に自動的に設定されるように定義されています。 これにより、TIMESTAMP
は、INSERT
またはUPDATE
操作のタイムスタンプの記録に役立ちます。NULL
値を許可するようにNULL
属性で定義されていないかぎり、NULL
値を割り当てることによって、すべてのTIMESTAMP
カラムを現在の日付と時間に設定することもできます。自動初期化および現在の日付と時間への自動更新は、
DEFAULT CURRENT_TIMESTAMP
およびON UPDATE CURRENT_TIMESTAMP
カラム定義句を使用して指定できます。 デフォルトでは、前述のように最初のTIMESTAMP
カラムにこれらのプロパティーが含まれます。 ただし、テーブル内のTIMESTAMP
カラムは、これらのプロパティを持つように定義できます。 -
時間です。 範囲は、
'-838:59:59.000000'
から'838:59:59.000000'
です。 MySQL では、TIME
値は'
形式で表示されますが、文字列または数値を使用したhh:mm:ss
[.fraction
]'TIME
カラムへの値の割当ては許可されます。小数秒精度を指定するには、0 から 6 の範囲のオプションの
fsp
値を指定できます。 0 の値は、小数部がないことを表します。 省略した場合、デフォルトの精度は 0 です。 -
4 桁形式の年。 MySQL では、
YEAR
値はYYYY
形式で表示されますが、文字列または数値を使用したYEAR
カラムへの値の割当ては許可されます。 値は、1901
から2155
または0000
として表示されます。入力値の
YEAR
の表示形式および解釈に関する追加情報については、セクション11.2.4「YEAR 型」を参照してください。注記MySQL 8.0.19 では、明示的な表示幅を持つ
YEAR(4)
データ型は非推奨になりました。将来のバージョンの MySQL ではサポートされなくなる予定です。 かわりに、同じ意味を持つ表示幅を指定せずにYEAR
を使用してください。MySQL 8.0 では、古いバージョンの MySQL で許可されている 2 桁の
YEAR(2)
データ型はサポートされていません。 4 桁のYEAR
に変換する手順は、MySQL 5.7 Reference Manual の 2-Digit YEAR(2) Limitations and Migrating to 4-Digit 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;