SQLのdate型についてまとめています。
SQL date型の使い方サンプル
SQLのdate型は日付を格納するデータ型です。date型は2020-04-20などのYYYY-MM-DD形式で指定します。
以下は、MySQLでサンプルデータベースのemployeesデータベースのemployeesテーブルの例です。date型のカラムbirth_dateとhire_dateには、YYYY-MM-DD形式で日付データが格納されています。
mysql> desc employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | NO | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ 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 | +--------+------------+------------+-----------+--------+------------+
【関連記事】
▶【MySQL】日付を扱う。DATEとSQLモードについて解説。
dateの日付変換は、date_formatで書式変更が可能
MySQLの場合、date型のデータは、date_formatでフォーマット変更が可能です。また、year()やmonth()など、date型のデータから年や月など特定の箇所を抜き出す関数も用意されています。
// 現在の日付・時刻 mysql> select now(); +---------------------+ | now() | +---------------------+ | 2020-04-17 02:29:05 | +---------------------+ // now()をYYYY-MM-DD形式に変換 mysql> select date_format(now(),'%Y-%m-%d' ); +--------------------------------+ | date_format(now(),'%Y-%m-%d' ) | +--------------------------------+ | 2020-04-17 | +--------------------------------+ // now()の日付部分のみ取得 mysql> select date(now()); +-------------+ | date(now()) | +-------------+ | 2020-04-17 | +-------------+ // now()の年部分のみ取得 mysql> select year(now()); +-------------+ | year(now()) | +-------------+ | 2020 | +-------------+
【関連記事】
▶【MySQL】DATE_FORMATの基本的な使い方と応用をわかりやすく解説。
日付の加算、減算はadddate
date型は月によって日数が異なるため、通常の加減算とは異なる処理が必要になります。MySQLでは、日数を考慮した日付の加減算をおこなうadddate関数が用意されています。
// 2020年3月30日に3ヶ月を加える mysql> select adddate('2020-03-30', interval 3 month); +-----------------------------------------+ | adddate('2020-03-30', interval 3 month) | +-----------------------------------------+ | 2020-06-30 | +-----------------------------------------+ // 2020年3月30日から、13ヶ月を引く mysql> select adddate('2020-03-30', interval -1 month); +------------------------------------------+ | adddate('2020-03-30', interval -1 month) | +------------------------------------------+ | 2020-02-29 | +------------------------------------------+
date型の日付比較の例
date型同士は不等号での比較が可能です。下記のSQLは、hire_date(雇用日)が1990年4月1日の6ヶ月後よりも後のemployees(社員)テーブルのデータを10件取得します。
mysql> select * from employees where hire_date > adddate('1990-04-01', interval 6 month) limit 10; +--------+------------+------------+-------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-------------+--------+------------+ | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10012 | 1960-10-04 | Patricio | Bridgland | M | 1992-12-18 | | 10016 | 1961-05-02 | Kazuhito | Cappelletti | M | 1995-01-27 | | 10017 | 1958-07-06 | Cristinel | Bouloucos | F | 1993-08-03 | | 10019 | 1953-01-23 | Lillian | Haddadi | M | 1999-04-30 | | 10020 | 1952-12-24 | Mayuko | Warwick | M | 1991-01-26 | | 10022 | 1952-07-08 | Shahaf | Famili | M | 1995-08-22 | | 10024 | 1958-09-05 | Suzette | Pettey | F | 1997-05-19 | | 10026 | 1953-04-03 | Yongqiao | Berztiss | M | 1995-03-20 | | 10028 | 1963-11-26 | Domenick | Tempesti | M | 1991-10-22 | +--------+------------+------------+-------------+--------+------------+
各データベースのdate型の注意点
Oracleでのdate型の注意点
Oracleでは、日付のデフォルトフォーマットは「日-月をあらわすアルファベット-年」です。YYYY-MM-DD形式に変換するには、to_char関数にフォーマットを指定します。
select to_char(SYSDATE) from dual; TO_CHAR(SYSDATE) --------- 17-APR-20 select to_char(SYSDATE,'YYYY-MM-DD') from dual; TO_CHAR(SYSDATE,'YYYY-MM-DD') --------- 2020-04-17
SQL Serverでのdate型の注意点
SQL Serverでは、date型の変換関数はformat()となります。
select format(getdate(),'yyyy-MM-dd'); 2020-04-17
また、ミリ秒の3桁目で丸め処理が発生するため、厳密な時刻比較をおこなう場合は注意が必要です。
関連)SQLServerでDATETIME型を使用する際の注意点
ProgreSQLでのdate型の注意点
select to_char(now(),'YYYY-MM-DD'); to_date ------- 2020-04-17 //空文字を変換すると、0001-01-01になる select TO_DATE('','YYYYMMDD'); to_date ------- 0001-01-01
MySQLと大きな違いはありませんが、空文字をto_dateで変換すると0001-01-01になるなど、MySQLやOracleとは細かい部分で挙動が変わります。
まとめ
- date型は日付データを格納するデータ型
- 日付の書式変換、日付の加減算、日付の比較が可能
- データベースにより、変換関数などに違いあり
SQLを学んでWebエンジニアを目指そう
Webエンジニアは、Webサービスを作るエンジニアで非常に人気の高い職種です。
スタートアップやベンチャー企業が中心なので柔軟性のある雇用形態、魅力的な作業環境、面白いプロジェクト、高い報酬など非常に魅力的な求人が多いです。
Ruby on RailsやGo言語を用いたプロジェクトが多く、SQLも重要なスキルとなります。
このブログを運営するプログラミングスクールのポテパンキャンプでは、実践的なカリキュラムと現役エンジニアからのレビュー、そしてポートフォリオ添削や模擬面談などの面談転職サポートにより、最短距離でWebエンジニアを目指すことができます。
Webエンジニアへの転職を考えている方は、是非一度無料カウンセリングへお申込みください。