今回は、MySQLでの日付・時刻操作について、初学者でも理解しやすいようにまとめました。
「日付を抽出したいけど、どう書くの?」
「1年後の日付を出したい!」
…そんな場面に役立つ、基礎関数+実用例をcarsテーブルを使って紹介していきます!
まずはテーブルの構造を確認
今回使うcarsテーブルには、こんなカラムがあります。
car_id | name | price | created_at | updated_at | deleted_at |
---|---|---|---|---|---|
1 | セダン | 2590000 | 2020-08-07 06:40:26 | 2023-08-08 08:58:01 | 2021-01-01 00:00:00 |
2 | クーペ | 4990000 | 2020-09-17 10:30:11 | 2023-08-26 02:14:46 | 2022-02-01 00:00:00 |
3 | SUV | 2990000 | 2020-10-07 06:40:26 | 2023-08-26 02:15:34 | NULL |
... | ... | ... | ... | ... | ... |
このテーブルを使って、MySQLの日付系関数の使い方を学びましょう!
MySQLの日付型と関数の基本
DATETIME型とは?
- 形式:
YYYY-MM-DD HH:MM:SS
- 例:
2020-08-07 06:40:26
- 特徴:日付と時刻を同時に格納できる型です
よく使う日付関数【一覧表】
関数 | 概要 | 例 |
---|---|---|
NOW() | 現在の日時を取得 | 2025-06-03 10:20:00 |
CURDATE() | 現在の日付だけ | 2025-06-03 |
DATE() | 日付部分だけ抽出 | DATE(created_at) |
TIME() | 時間部分だけ抽出 | TIME(created_at) |
YEAR(), MONTH(), DAY() | 年・月・日を抽出 | YEAR(created_at) |
DATEDIFF() | 2つの日付の差(日数) | DATEDIFF(NOW(), created_at) |
DATE_ADD() | 日付を加算 | DATE_ADD(created_at, INTERVAL 1 YEAR) |
DATE_SUB() | 日付を減算 | DATE_SUB(created_at, INTERVAL 1 DAY) |
TIMESTAMPDIFF() | 単位を指定して差を出す | TIMESTAMPDIFF(MONTH, created_at, NOW()) |
DATE_FORMAT() | 日付を文字列として整形 | DATE_FORMAT(created_at, '%Y/%m/%d') |
carsテーブルで使える実例
① created_atの日付だけを抽出したい
SELECT DATE(created_at) AS date_only FROM cars;
date_only |
---|
2020-08-07 |
2020-09-17 |
2020-10-07 |
② 年月日を分解して取り出す
SELECT
YEAR(created_at) AS year,
MONTH(created_at) AS month,
DAY(created_at) AS day
FROM cars;
③ 今年の年末まであと何日?
SELECT DATEDIFF('2023-12-31', created_at) AS days_until_end_of_year FROM cars;
④ 登録日(created_at)に1年加算したい
SELECT DATE_ADD(created_at, INTERVAL 1 YEAR) AS next_year FROM cars;
⑤ created_atからの経過月数を求める
SELECT TIMESTAMPDIFF(MONTH, created_at, NOW()) AS months_since_created FROM cars;
⑥ created_atの曜日・月日を知りたい
SELECT
DAYOFWEEK(created_at) AS day_of_week,
WEEK(created_at) AS week_of_year
FROM cars;
DAYOFWEEK
は 1=日曜日, 2=月曜日, … という形式で返します。
⑦ 日付の整形(フォーマット変換)
SELECT DATE_FORMAT(created_at, '%Y年%m月%d日 %H時%i分') AS jp_format FROM cars;
jp_format |
---|
2020年08月07日 06時40分 |
日付がNULLの行を除外したい場合は?
SELECT * FROM cars WHERE deleted_at IS NOT NULL;
現在の日時を取得するだけなら?
SELECT NOW();
-- → '2025-06-03 10:45:12'
補足:タイムゾーンについて
MySQLサーバーはデフォルトでUTCになっていることがあります。
JST(日本時間)に合わせたい場合は、次のように確認と設定が必要です。
SELECT @@global.time_zone; -- 現在のタイムゾーンを確認
まとめ
MySQLの日付関連機能を使いこなすことで、次のようなことが簡単にできるようになります。
- 特定日より後のデータを抽出
- 日時の加減算
- 日付フォーマットの整形
- 登録からの経過期間の集計
今後の学習の指針
TIMESTAMP
との違い(タイムゾーンの扱い)を比較してみようIFNULL
,COALESCE
を使ってNULLを埋める工夫も習得しよう- 曜日名(
DAYNAME()
)や月名(MONTHNAME()
)も表示してみよう - 日時のインデックス設計についても学んでパフォーマンスを意識しよう
データベースの運用では、「いつ」データが作られたか・更新されたかを把握することがとても大切です。
日付関数を味方につけて、賢くスマートなSQLライフを送ってくださいね!
何かつまずいたら、いつでも相談してください!