SQLで扱う日付についてまとめています。
SQLで日付を扱う方法
SQLの日付をフォーマットして出力する
SQLで日付を好きなフォーマットに変更して出力するには、DATE_FORMATEを使います。例えばMySQLのデフォルトでは以下のように日付の形式は「1953-09-02」のような「YYYY-MM-DD」形式になっています。
mysql> select * from employees limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.04 sec)
以下は、フォーマット文字を指定してDATE_FORMATで「YYYY/MM/DD」形式に変更してbirth_date(誕生日)を出力している例です。
SELECT emp_no, Date_format(birth_date, '%Y/%m/%d') AS birth_date, first_name, last_name FROM employees LIMIT 10; +--------+------------+------------+-----------+ | emp_no | birth_date | first_name | last_name | +--------+------------+------------+-----------+ | 10001 | 1953/09/02 | Georgi | Facello | | 10002 | 1964/06/02 | Bezalel | Simmel | | 10003 | 1959/12/03 | Parto | Bamford | | 10004 | 1954/05/01 | Chirstian | Koblick | | 10005 | 1955/01/21 | Kyoichi | Maliniak | | 10006 | 1953/04/20 | Anneke | Preusig | | 10007 | 1957/05/23 | Tzvetan | Zielinski | | 10008 | 1958/02/19 | Saniya | Kalloufi | | 10009 | 1952/04/19 | Sumant | Peac | | 10010 | 1963/06/01 | Duangkaew | Piveteau | +--------+------------+------------+-----------+ 10 rows in set (0.00 sec)
【関連記事】
▶SQLの日付フォーマットを把握しよう!データ型と変換方法について
SQLの日付を比較する
日付を比較するには、日付を表す文字をシングルクォートで囲って等号や不等号、BETWEEN演算子などで比較します。
以下は、birth_date(誕生日)が1958年1月1日以前の社員のデータを出力している例です。
mysql> select * from employees where birth_date < '1958-01-01' limit 10; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10011 | 1953-11-07 | Mary | Sluis | F | 1990-01-22 | | 10014 | 1956-02-12 | Berni | Genin | M | 1987-03-11 | | 10018 | 1954-06-19 | Kazuhide | Peha | F | 1987-04-03 | | 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | +--------+------------+------------+-----------+--------+------------+ 10 rows in set (0.00 sec)
【関連記事】
▶【初心者向け】SQLのWHERE句で日付を比較する方法まとめ!
比較対象が単純な固定された日付ではなく、「1ヶ月後」「3日後」などの場合は、日付の計算が必要です。以下は、現在から2年後の日付を求める例で、現在の時間にINTERVAL 2 YEAR(2年間)を足しています。このように、日付には足し算や引き算が可能です。
SELECT DATE_ADD(now(), INTERVAL 2 YEAR); +----------------------------------+ | DATE_ADD(now(), INTERVAL 2 YEAR) | +----------------------------------+ | 2022-07-27 16:09:54 | +----------------------------------+
【関連記事】
▶【初心者向け】SQLの日付計算を試してみよう【MySQL】
「2020年3月3日の1ヶ月後は?」など、指定した日付を使った計算をおこなうには、文字列型の日付「2020-03-03」を日付型に変換する必要があります。変換には、castを使います。DBMSごとの独自拡張では、TO_DATEやSTR_TO_DATEのような便利な関数もあります。
【関連記事】
▶【SQL】TO_DATE関数の使い方|PostgreSQL・MySQLでの代用法も
まとめ
- SQLで日付をフォーマットして出力するにはDATE_FORMAT関数を使う
- SQLの日付の比較には、等号や不等号が使用可能
- SQLの日付は足し算や引き算が可能。