「SQLの日付で集計したいけど、クエリがなかなか書けない…」
こんな壁にぶつかった経験、私たちエンジニアには“あるある”ですよね。
JOINやGROUP BYは使いこなせても、日付関数は少し難しく感じることも多いですよね。
この記事で、つまずきやすいポイントを一緒に整理していきましょう。
用語解説:JOIN
複数のテーブルを結合し、関連するデータをまとめて取得するSQLの基本操作。用語解説:GROUP BY
データを指定したカラムごとにグループ化し、集計処理(合計・件数など)を行うためのSQL句。用語解説:日付関数
日付や時刻の値を取得・変換・計算するためのSQL関数群。DBMSごとに書き方や関数名が異なる場合がある。
本ガイドでは、
・SQL日付関数の仕組み
・当月・前月・期間指定でよく使う現場テンプレ
・MySQL/PostgreSQL/Oracleごとの違い
・初心者がハマる“失敗”パターンと回避法
・コピペですぐ動くサンプル例
まで、実務ですぐ試せるよう体系立てて解説します。
迷ったとき、安心して戻ってこられる“現場の味方”にしてください。
(SQLのサブクエリや複雑な集計については『【SQL】副問い合わせ入門|基本構文から実例まで徹底解説』も参考になります)
SQL日付関数とは?基礎知識と「現場で困る理由」
「なぜ日付関数はこんなにややこしいのか?」
その正体は、“データ型”や“DBごとの書き方”が微妙に違うからです。
たとえば「今月だけデータを抽出」したい場合でも、DBMSごとに書き方が変わります。
用語解説:データ型
データベースで扱う値の種類(例:日付型、文字列型、数値型など)。型が異なると演算や比較の挙動が変わる。用語解説:DBMS
データベース管理システム(MySQL、PostgreSQL、Oracleなど)。SQLの文法や関数に違いがある。
- 今日・今月・前月のデータを取得したい
- 日付ごとに売上や件数を集計したい
- 日付形式を整えたい(YYYY-MM-DDなど)
現場でよく使うのは、CURRENT_DATE、DATE_ADD/DATE_SUB、DATEDIFF、DATE_FORMATなど。
一度コツを掴めば、現場SQLの“脱・コピペ依存”が叶います。
用語解説:CURRENT_DATE
現在の日付(システム日付)を返すSQL関数。DBMSごとに同名または類似の関数がある。用語解説:DATE_ADD/DATE_SUB
日付に対して日数や月数を加算・減算する関数。MySQLなどでよく使われる。用語解説:DATEDIFF
2つの日付の差(日数)を計算する関数。用語解説:DATE_FORMAT
日付や時刻を指定した書式(例:YYYY-MM-DD)で文字列に変換する関数。
主なSQL日付関数とDB別サンプル
■ MySQLでの日付関数
- 今日:SELECT CURRENT_DATE;
- 1か月前:SELECT DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH);
- 書式変換:SELECT DATE_FORMAT(NOW(), ‘%Y-%m-%d’);
- 差分:SELECT DATEDIFF(‘2025-12-15’, ‘2025-12-01’);
用語解説:NOW()
現在の日付と時刻を返すMySQLの関数。用語解説:INTERVAL
日付計算で使う期間指定子。例:INTERVAL 1 MONTHは「1か月分」を意味する。
■ PostgreSQLでの日付関数
- 今日:SELECT CURRENT_DATE;
- 1か月前:SELECT CURRENT_DATE – INTERVAL ‘1 month’;
- 書式変換:SELECT TO_CHAR(NOW(), ‘YYYY-MM-DD’);
- 差分:SELECT (‘2025-12-15’::date – ‘2025-12-01’::date);
用語解説:TO_CHAR
日付や数値を指定した書式の文字列に変換するPostgreSQLやOracleの関数。用語解説:::date
PostgreSQLで型変換を行う記法。’2025-12-15′::dateは文字列を日付型に変換する。
■ Oracleでの日付関数
- 今日:SELECT SYSDATE FROM DUAL;
- 1か月前:SELECT ADD_MONTHS(SYSDATE, -1) FROM DUAL;
- 書式変換:SELECT TO_CHAR(SYSDATE, ‘YYYY-MM-DD’) FROM DUAL;
- 差分:SELECT TO_DATE(‘2025-12-15′,’YYYY-MM-DD’) – TO_DATE(‘2025-12-01′,’YYYY-MM-DD’) FROM DUAL;
用語解説:SYSDATE
Oracleで現在の日付と時刻を返す関数。用語解説:DUAL
OracleでSELECT文の動作確認などに使う特殊な1行テーブル。用語解説:ADD_MONTHS
指定した月数だけ日付を加算・減算するOracleの関数。用語解説:TO_DATE
文字列を日付型に変換する関数。
■ SQL Serverその他
GETDATE()、DATEADD、CONVERTなどを使用します。
引数や書式が異なるため、現場ごとの確認が必須です。
用語解説:GETDATE()
SQL Serverで現在の日付と時刻を返す関数。用語解説:DATEADD
SQL Serverで日付に日数や月数を加算・減算する関数。用語解説:CONVERT
データ型や日付書式を変換するSQL Serverの関数。
よく使う「当月・前月・期間指定」クエリ【テンプレ集】
■ 当月データを抽出
SELECT * FROM テーブル名
WHERE DATE_FORMAT(日付カラム, '%Y-%m') = DATE_FORMAT(CURRENT_DATE, '%Y-%m');
■ 前月データを抽出
SELECT * FROM テーブル名
WHERE DATE_FORMAT(日付カラム, '%Y-%m')
= DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m');
■ 任意期間を指定
SELECT * FROM テーブル名
WHERE 日付カラム BETWEEN '2025-12-01' AND '2025-12-15';
(BETWEENの使い方や注意点は『SQL BETWEENの使い方と注意点|範囲指定・失敗例・日付対応を徹底解説』をご参照ください)
用語解説:BETWEEN
指定した2つの値の範囲内にあるデータを抽出するSQLの演算子。
ありがち失敗例と対策
- 日付型と文字列型の混在:CASTやTO_DATEで明示変換
- BETWEENの範囲ミス:月末・時間指定に注意
- タイムゾーン未考慮:AT TIME ZONEの利用を検討
(SQLのAS句やエイリアスの使い方は『SQL AS句とは?エイリアスの使い方・省略・現場レビュー徹底ガイド』もご参照ください)
用語解説:CAST
データ型を明示的に変換するSQLの標準関数。用語解説:AT TIME ZONE
日付や時刻にタイムゾーン情報を付与・変換するSQLの構文。DBMSによってサポート状況が異なる。
まとめ|SQL日付関数を現場で使い倒すために
SQL日付関数は、どの現場でも必須のスキルです。
テンプレをまず動かし、自分用のクエリ集として育てていきましょう。
ぜひコードをコピペして、まずは動かしてみてください。
FAQ|よくある質問
- Q. よく使う日付関数は?
A. CURRENT_DATE、DATE_ADD、DATEDIFFなどです。 - Q. 当月・前月の取得方法は?
A. 年月フォーマットで比較する方法が一般的です。 - Q. 処理が重くなる原因は?
A. インデックスが効かない条件指定が主な原因です。