Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

TO_DATE関数のフォーマット

TO_DATE関数とは、文字列で指定した日付をDATEデータ型に変換する関数のことです。

TO_DATE関数は、次のように記述して使います。

TO_DATE(char, format);

関数名は大文字・小文字の区別はしないため、「TO_DATE」と表現しても「to_date」としても問題ありません。

TO_DATE関数の引数

TO_DATE関数の引数は「char」と「format」の2種類です。

それぞれ次のような意味をもっています。

TO_DATE関数の引数
  • char:日付に当てはまる文字列です。
  • format:charの「書式」が指定できる日時書式です。省略した場合はデフォルト書式が設定されます。

formatには、次の書式が使用可能です。

指定子 説明
YYYY 西暦4桁
YY 西暦年下2ケタ
MM 月2桁
DD 日2桁
HH 時間2桁(01から12)
HH24 時間2桁 24時間表記(00~24)
MI 分2桁
SS 秒2桁

PostgreSQLでもTO_DATE関数は使用可能

TO_DATE関数は「Oracle」で使われるSQL関数ですが、PostgreSQLでも使用可能です。

具体的な使い方については「TO_DATE関数の使用例」で見ていきましょう。

MySQLではSTR_TO_DATE関数を使用

MySQLではTO_DATE関数が使えませんが、代わりに「STR_TO_DATE関数」を使います。

MySQLで使用する書式は、次の通りです。

指定子 説明
%a 簡略曜日名 (Sun..Sat)
%b 簡略月名 (Jan..Dec)
%c 月、数字 (0..12)
%D 英語のサフィクスを持つ日付 (0th, 1st, 2nd, 3rd, …)
%d 日、数字 (00..31)
%e 日、数字 (0..31)
%f マイクロ秒 (000000..999999)
%H 時間 (00..23)
%h 時間 (01..12)
%I 時間 (01..12)
%i 分、数字 (00..59)
%j 年間通算日 (001..366)
%k 時 (0..23)
%l 時 (1..12)
%M 月名 (January..December)
%m 月、数字 (00..12)
%p AM または PM
%r 時間、12 時間単位 (hh:mm:ss に AM または PM が続く)
%S 秒 (00..59)
%s 秒 (00..59)
%T 時間、24 時間単位 (hh:mm:ss)
%U 週 (00..53)、日曜日が週の初日、WEEK() モード 0
%u 週 (00..53)、日曜日が週の初日、WEEK() モード 1
%V 週 (01..53)、日曜日が週の初日、WEEK() モード 2、%X とともに使用
%v 週 (01..53)、月曜日が週の初日、WEEK() モード 3、%x とともに使用
%W 曜日名 (Sunday..Saturday)
%w 曜日 (0=Sunday..6=Saturday)
%X 年間の週、日曜日が週の初日、数字、4 桁、%V とともに使用
%x 年間の週、日曜日が週の初日、数字、4 桁、%v とともに使用
%Y 年、数字、4 桁
%y 年、数字 (2 桁)
%% リテラル 「%」 文字
%x x (上記にないすべての 「x」)

※参考:12.7 日付および時間関数

こちらも詳しい使い方は「TO_DATE関数の使用例」で解説します。

TO_DATE関数の使用例

ここでは、TO_DATE関数の使い方をサンプルを用いて確認していきましょう!

MySQLでは、STR_TO_DATE関数の使い方を見ていきます。

文字列を日付型(時間)に変換

任意の文字列を日付型に変換するには、次のように記述可能です。

mydb=# SELECT TO_DATE('20200811', 'YYYYMMDD');
  to_date   
------------
 2020-08-11
(1 row)

「20200811」という文字列を、YYYYMMDDの書式で日付型に変換できました。

日付型に変換すると、「YYYY-MM-DD」で表現されます。

 

テーブルのカラムを日付型に変換したい場合も見てみましょう。

次のようなテーブルを作成し、データを追加しました。

mydb=# CREATE TABLE tb0811(no integer, name varchar(20), date varchar(20));
mydb=# SELECT * FROM tb0811;
 no |   name   |    date    
----+----------+------------
  1 | Satou    | 1992/01/17
  2 | Tanaka   | 1995/05/22
  3 | Yamamoto | 1996/10/04
(3 rows)

このテーブルの「date」カラムを日付型に変換してデータを取得してみます。

mydb=# SELECT no, name, TO_DATE(date, 'YYYY/MM/DD') FROM tb0811;
 no |   name   |  to_date   
----+----------+------------
  1 | Satou    | 1992-01-17
  2 | Tanaka   | 1995-05-22
  3 | Yamamoto | 1996-10-04
(3 rows)

「date」カラムがTO_DATEで日付型に変換できました!

 

では、MySQLでも同じように任意の文字列を日付型に変換してみます。

mysql> SELECT STR_TO_DATE('20200811', '%Y%m%d');
+-----------------------------------+
| STR_TO_DATE('20200811', '%Y%m%d') |
+-----------------------------------+
| 2020-08-11                        |
+-----------------------------------+
1 row in set (0.00 sec)

このように、日付型に変換できました。

なお、任意の文字列が変換したい書式と異なっている場合や、区切り文字の有無によっては正しく変換できないので注意しましょう。

mysql> SELECT STR_TO_DATE('20200811', '%Y%M%d');
+-----------------------------------+
| STR_TO_DATE('20200811', '%Y%M%d') |
+-----------------------------------+
| NULL                              |
+-----------------------------------+
1 row in set, 2 warnings (0.00 sec)

mysql> SELECT STR_TO_DATE('20200811', '%Y/%m/%d');
+-------------------------------------+
| STR_TO_DATE('20200811', '%Y/%m/%d') |
+-------------------------------------+
| NULL                                |
+-------------------------------------+
1 row in set, 2 warnings (0.00 sec)

日付型(時間)を文字列に変換する

TO_DATE関数は、「文字列→日付型」に変換する関数でした。

逆に、「日付型→文字列」に変換したい場合は「TO_CHAR関数」を使いましょう。

mydb=# SELECT TO_CHAR(NOW(), 'YYYY/MM/DD HH24:MI:SS');
       to_char       
---------------------
 2020/08/11 23:18:35
(1 row)

上記は、現在の日時を文字列型に変換しています。

このように、TO_CHAR関数を使えば日付型を文字列型に変換可能です。

時間・時刻に変換

TO_TIMESTAMP関数を使うことで、任意の文字列を日時に変換できます。

サンプルで表示を確認してみましょう。

mydb=# SELECT TO_TIMESTAMP('20200812125200', 'YYYYMMDDHH24MISS');
      to_timestamp      
------------------------
 2020-08-12 12:52:00+09
(1 row)

上記のように、時間まで表示できているのがわかります。

和暦・西暦に変換

OracleDBでは、次のようにnls_paramを使うことで和暦を西暦に表示することも可能です。

TO_DATE('H31-01-01', 'EYY-MM-DD', 'NLS_CALENDAR=''JAPANESE IMPERIAL''')

また、TO_CHAR関数を使うことで西暦を和暦に変換できます。

詳しくは、次のサイトを参考にしてみてください。

参考:文字列を日付型に変換、和暦を西暦に変換

TO_DATE関数で日付を計算する

TO_DATE関数で日付を計算するのは非常に簡単で、通常の演算のように「+ 値」を記述すればOKです。

サンプルで計算結果を確認してみましょう。

mydb=# SELECT to_date('20200812', 'YYYYMMDD') + 5 as to_date;
  to_date   
------------
 2020-08-17
(1 row)

このように、2020年8月12日の5日後である2020年8月17日が取得できました。

365を足せば、1年後である2021年8月12日が取得できます。

mydb=# SELECT to_date('20200812', 'YYYYMMDD') + 365 as to_date;
  to_date   
------------
 2021-08-12
(1 row)

また、値を引くことで日付を遡ることも可能です。

mydb=# SELECT TO_DATE('20200812', 'YYYYMMDD') - 10 AS to_date;
  to_date   
------------
 2020-08-02
(1 row)

TO_DATE関数をWHERE句で使う

TO_DATE関数をWHERE句の比較で使う方法を見ていきましょう。

先ほど用意した「tb0811」テーブルを使い、データを取得してみます。

mydb=# SELECT * FROM tb0811 WHERE '1995-05-22' = TO_DATE(date, 'YYYY/MM/DD');
 no |  name  |    date    
----+--------+------------
  2 | Tanaka | 1995/05/22
(1 row)

このように、取得したい日付とデータを比較して取得が可能です。

また、下記のように指定日時以降のデータだけを取得するといった比較方法もできます。

mydb=# SELECT * FROM tb0811 WHERE '19930101' <= TO_DATE(date, 'YYYY/MM/DD');
 no |   name   |    date    
----+----------+------------
  2 | Tanaka   | 1995/05/22
  3 | Yamamoto | 1996/10/04
(2 rows)

特定の日時前後のデータを取得したい場合などに、活用できるでしょう。

まとめ

SQLのTO_DATE関数について解説しました。

TO_DATE関数は、任意の文字列を日付型に変換できる関数になっています。

MySQLではSTR_TO_DATE関数を使うなど、DBMSによって使用する関数は異なります。

ぜひ、この記事を参考にTO_DATE関数の使い方をマスターしてください。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。