English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SQL 日付と時間

このチュートリアルでは、SQLで日付と時間を使用する方法を学びます。

日付と時間処理

文字列や数字に加えて、データベースに日付と/文字列や数字に加えて、ユーザーの生年月日や従業員の雇用日、将来のイベントの日付、テーブル内で特定の行を作成または修正した日付と時間など、日付と時間値をデータベースに保存する必要があります。

このタイプのデータは一時データと呼ばれ、各データベースエンジンにはそれらを保存するためのデフォルトのストレージ形式とデータタイプがあります。以下の表は、MySQLデータベースサーバーがサポートする日付と時間のデータタイプを示しています。

タイプ設定形式許容値
DATEYYYY-MM-DD1000-01-01 - 9999-12-31
TIMEHH:MM:SSまたはHHH:MM:SS-838:59:59 - 838:59:59
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 - 9999-12-31 23:59:59
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 - 2037-12-31 23:59:59
YEARYYYY1901 - 2155

DATE値の形式はYYYY-MM-DD、YYYYは全年を表します(4桁の数字であり、MMとDDは日付の月と日部分(両方に先頭のゼロがある数字)をそれぞれ表します。時間値は通常HH:MM:SS形式で表され、HH、MM、SSは時間の時間部分、分部分、秒部分をそれぞれ表します。

以下の文は、データベーステーブルに日付値を挿入する方法を示しています:

INSERT INTO employees (emp_name, hire_date, salary)
VALUES ('Adam Smith', '2015-06-24', 4500);

注意:MySQLでは、時間部分の時間値が大きくなる可能性があります。これは、MySQLがそれらを実行時間として扱っているためです。これは、時間データ型が一日の中の時間(必ずしも小さくありません)を表すだけでなく、24時間()であり、2つのイベント間の時間間隔を表すこともできます。これは、それ以上の時間間隔も可能です。24時間、時には負の値も可能です。

行の作成または修正時間の追跡

大規模アプリケーションのデータベースを使用する際には、通常、データベースにレコードの作成時間や最終更新時間を保存する必要があります。例えば、ユーザー登録時やユーザーが最後にパスワードを更新した日時などです。

MySQLでは、NOW()関数を使用して現在のタイムスタンプを挿入できます。以下のようになります:

-- MySQLデータベースの構文
INSERT INTO users (name, birth_date, created_at)
VALUES ('Bilbo Baggins', '1998-04-16', NOW());

しかし、現在の日付と時間を手動で挿入しない場合、TIMESTAMPおよびDATETIMEデータ型の自動初期化と自動更新属性を使用するだけで済みます。

自動属性を割り当てるには、列定義でDEFAULT CURRENT_TIMESTAMPおよびON UPDATE CURRENT_TIMESTAMP子句を指定してください。以下のようになります:

-- MySQLデータベースの構文
CREATE TABLE users (
    id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL UNIQUE,
    birth_date DATE NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

注意:DATETIMEデータ型の自動初期化と更新は、MySQL 5.6.5バージョンで利用可能です。古いバージョンを使用している場合はTIMESTAMPを使用してください。

日付や時間の一部を抽出する

ある場合、日付や時間の一部のみを取得したいかもしれません。MySQLでは、部分時間値を抽出するために特別に設計された関数、例えばYEAR()、MONTH()、DAYOFMONTH()、MONTHNAME()、DAYNAME()、HOUR()、MINUTE()、SECOND()などを使用できます。

以下のSQL文はbirth_date列の値の年部分を抽出します。例えば、どのユーザーの誕生日が1987-01-14、ならYEAR(birth_date)は1987。

mysql> SELECT name, YEAR(birth_date) FROM users;

同様に、DAYOFMONTH()関数を使用して月の特定の日を取得できます。例えば、どのユーザーのbirth_dateが1986-10-06、それではDAYOFMONTH(birth_date)は返されます6。

mysql> SELECT name, DAYOFMONTH(birth_date) FROM users;

日付や時間をフォーマットする

結果集中でより描述的で読みやすい日付形式を使用する場合は、DATE_FORMAT()とTIME_FORMAT()関数を使用して現在の日付と時間値を再フォーマットすることができます。

以下のSQL文は、より読みやすく設定された形式で表示されますusersテーブルbirth_date列の値のフォーマット、例えば1987年1月14日から1987年1月14日の値。

mysql> SELECT name, DATE_FORMAT(birth_date, '%M %e, %Y') FROM users;