今回は、MySQLの日付型や時刻型の関数で使うフォーマット指定子について説明します。
文字列から日付型への変換や、既存の日付データを別の形式(例:yyyymmdd→yyyy/mm/dd)に変換する場合、MySQLではフォーマット指定子で形式を指定する必要があります。
また、たとえば月の表記をゼロ埋めして2桁表示するのか、ゼロ埋めはしないのか、といった指定もフォーマット指定子の使い分けで実現することができます。
この記事では、MySQLの日付や時刻、また曜日や週番号などの用途で使用するフォーマット指定子を紹介します。
あわせて、MySQLの日付型・時刻型に関連する関数についても紹介します。
MySQLの日付・時刻型のフォーマット指定子
この章では、MySQLで文字列を日付型や時刻型データに変換するときに使用するフォーマット指定子について説明します。フォーマット指定子とはMySQLの一部の関数において、出力(変換)する日付・時刻データをどのような形式にするかを指定するために使います。
MySQLで使用する主なフォーマット指定子は下記のとおりです
MySQL:日付型のフォーマット指定子
日付型の指定子 | 説明 | 例 |
---|---|---|
%Y | 4桁の年 | 2024 |
%m | 0埋めされた2桁の月 | 03 |
%c | 0埋めなしの月 | 3 |
%d | 0埋めされた2桁の日 | 09 |
%e | 0埋めなしの日 | 9 |
MySQL:時刻型のフォーマット指定子
時刻型の指定子 | 説明 | 例 |
---|---|---|
%H | 0埋めされた2桁の時間(24時間形式) | 09や13 |
%k | 0埋めなしの時間(24時間形式) | 9や13 |
%h、%I | 0埋めされた2桁の時間(12時間形式) | 09や01 |
%l | 0埋めなしの時間(12時間形式) | 9や1 |
%i | 0埋めされた2桁の分 | 05 |
%s、%S | 0埋めされた2桁の秒 | 03 |
%f | マイクロ秒 | 000000から999999 |
%p | AMまたはPM | AM |
MySQL:その他のフォーマット指定子
その他の指定子 | 説明 | 例 |
---|---|---|
%W | 曜日名 | Monday |
%a | 曜日の省略形 | Mon |
%D | 日に接尾辞を付加 | 1st, 2nd, 3rd, 4th… |
%M | 月名 | January |
%b | 月の省略形 | Jan |
%j | 年の通算日 | 001から366 |
%u | 週番号(月曜日開始) | – |
%U | 週番号(日曜日開始) | – |
%v | 年の週番号(月曜日開始) | – |
%V | 年の週番号(日曜日開始) | – |
※多くのフォーマット指定子では出力が英語表記になります。
- %u: ISO週番号(週の始まりは月曜日)。年の最初の木曜日が含まれる週を1週目とします。
- %U: 週番号(週の始まりは日曜日)。1月1日を含む週を1週目とします。
例:x年1月1日(金曜日)
%uを使う場合
x年の最初の木曜日は1月7日になりますので、1月1日は前年の最後の週に属します。そのため、%u
での週番号は01ではなく、前年の最後の週番号となります。
%Uを使う場合
1月1日を含む週をその年の第1週とします。1月1日が週のどの日にあっても、その週を1週目として数えます。
MySQLの日付・時刻を扱う関数
この章では、MySQL独自の日付型・時刻型のフォーマット指定子を使う関数を説明します。
一般に、日付や時刻でフォーマット指定子を使う主要な関数は、STR_TO_DATE
、DATE_FORMAT
、TIME_FORMAT
の3つですが、参考情報としてその他の関数も含めて紹介します。
STR_TO_DATE:文字列からの変換
STR_TO_DATE
は、文字列の情報を日付型に変換するときに使用する関数です。変換後は、MySQLの標準日付形式であるYYYY-MM-DD
になります。
STR_TO_DATEの構文
文字列を日付型に変換する
STR_TO_DATE(‘文字列’, ‘フォーマット’)
第1引数・・日付データを表す文字列
第2引数・・その文字列のフォーマットを定義する形式
STR_TO_DATEの例
yyyymmdd形式からの変換
SELECT STR_TO_DATE('20240301', '%Y%m%d');
yyyy/mm/dd形式からの変換
SELECT STR_TO_DATE('2024/03/01', '%Y/%m/%d');
yyyy年mm月dd日からの変換
SELECT STR_TO_DATE('2024年03月01日', '%Y年%c月%e日');
DATE_FORMAT:指定した日付形式に変換
DATE_TO_FORMAT
は、元データを指定した日付形式に変換するときに使用する関数です。
DATE_TO_FORMAT
は2024/03/09、または2024/3/9のように、2桁の際に0を含めるか含めないかの指定のほか、03/09/24(月/日/年)やMar-9といった、さまざまな任意の日付形式に変換することができます。
DATE_FORMATの構文
文字列を日付型に変換する
DATE_FORMAT(‘日付’, ‘フォーマット’)
第1引数・・変換したい日付データ(日付型)
第2引数・・変換後の日付のフォーマットを定義する形式
DATE_FORMATの例
yyyymmdd形式への変換
SELECT DATE_FORMAT('2024-03-01', '%Y%m%d');
yyyy/mm/dd形式への変換
SELECT DATE_FORMAT('2024-03-01', '%Y/%m/%d');
yyyy年mm月dd日への変換
SELECT DATE_FORMAT('2024-03-01', '%Y年%c月%e日');
TIME_FORMAT:指定した時刻形式に変換
TIME_TO_FORMAT
は、元データを指定した時刻形式に変換するときに使用する関数です。
TIME_TO_FORMAT
は16:37:12、または16時37分12秒のように、さまざまな任意の時刻形式に変換することができます。また、12時間・24時間形式の指定や、時間が2桁の際に0を含めるか含めないかの指定も可能です。
TIME_FORMATの構文
文字列を日付型に変換する
TIME_FORMAT(‘時刻’, ‘フォーマット’)
第1引数・・変換したい時刻データ(時刻型)
第2引数・・変換後の時刻のフォーマットを定義する形式
TIME_FORMATの例
HH:mm:ss形式への変換
SELECT TIME_FORMAT('15:30:45', '%H:%i:%s');
h時m分s秒形式への変換
SELECT TIME_FORMAT('15:30:45', '%h時%i分%s秒');
午前/午後 h時m分への変換
SELECT TIME_FORMAT('15:30:45', '%p %h時%i分');
その他の関数
前節で紹介したSTR_TO_DATE
、DATE_FORMAT
、TIME_FORMAT
以外でも、日付・時刻に関連する関数には下記のようなものがあります。
UNIX_TIMESTAMP
とWEEK
では直接的にフォーマット指定子を使いませんが、日付・時刻型の関連関数として紹介しておきます。
FROM_UNIXTIME
UNIXタイムスタンプを日付や時刻の文字列に変換します。タイムスタンプとフォーマット指定子を引数に取り、フォーマットされた日付や時刻の文字列を返します。
SELECT FROM_UNIXTIME(1700000000, '%Y-%m-%d %H:%i:%s');
UNIX_TIMESTAMP
日付や時刻をUNIXタイムスタンプ(1970年1月1日からの秒数)に変換します。日付や時刻の文字列を引数に取り、そのUNIXタイムスタンプを返します。
SELECT UNIX_TIMESTAMP('2024-03-01 12:00:00');
WEEK
日付から週番号を抽出します。年の始まりや週の始まり(日曜日や月曜日)を指定することで、週番号を取得できます。
SELECT WEEK('2024-03-01');
あとがき
今回は、MySQLの日付型・時刻型の関数で使用するフォーマット指定子について説明しました。
記事で取り上げたフォーマット指定子は、標準SQLではなくMySQL独自のものであるため、SQL全般の書籍などにも掲載されていない場合があります。
主要なフォーマット指定子は紹介したつもりですが、より専門性の高い用途で使用する場合には、MySQL公式のドキュメントを確認するとよいでしょう。