SQL Serverを使ってデータを扱う際、日付(日付時刻)データの計算は非常に重要です。
売上集計や勤怠管理、レポート作成など、あらゆるシステムで「〇日前のデータ」や「今月の残り日数」などを算出する必要があります。
本記事では、初心者でもわかりやすいように、SQL Serverでよく使う日付計算の基礎を丁寧に解説します。
現在日時の取得
現在の日付・時刻を取得するには、次の関数を使います。
SELECT GETDATE(); -- DATETIME型で現在日時を返す
SELECT SYSDATETIME(); -- DATETIME2型でより高精度な現在日時を返す
SELECT CAST(GETDATE() AS DATE); -- DATE型で日付のみを取得
- GETDATE() は秒以下3桁の精度
- SYSDATETIME() は秒以下7桁の精度
日付の加減算(DATEADD)
日付に対して日数・月数・年数などを加減算するには DATEADD を使います。
-- 5日後
SELECT DATEADD(day, 5, GETDATE());
-- 2ヶ月前
SELECT DATEADD(month, -2, GETDATE());
-- 1年後
SELECT DATEADD(year, 1, '2025-06-27');
引数 | 説明 |
---|---|
第一引数(単位) | year, quarter, month, day, hour, minute, second など |
第二引数(数値) | 加算する数(負の数で減算) |
第三引数(日付) | 対象の日付 |
日数・月数・年数の差分(DATEDIFF)
二つの日付の差を計算するには DATEDIFF を使います。
-- 日数の差(終日をまたいだ日数)
SELECT DATEDIFF(day, '2025-06-01', '2025-06-27'); -- 結果: 26
-- 月数の差
SELECT DATEDIFF(month, '2024-01-15', '2025-06-27'); -- 結果: 17
-- 年数の差
SELECT DATEDIFF(year, '2000-12-31', '2025-06-27'); -- 結果: 25
注意点として、DATEDIFF は単位の境界をまたいだ回数を数えるため、完全に「丸○ヶ月」や「丸○年」ではないことがあります。
日付の一部を取得(DATEPART)
日付から「年」や「月」、「曜日」など特定の要素だけを抜き出すには DATEPART を使います。
SELECT DATEPART(year, GETDATE()) AS 年;
SELECT DATEPART(month, GETDATE()) AS 月;
SELECT DATEPART(day, GETDATE()) AS 日;
SELECT DATEPART(weekday, GETDATE()) AS 曜日; -- 1:日曜日~7:土曜日
曜日の開始曜日はサーバーの設定によって変わるため、必要に応じて SET DATEFIRST で変更できます。
月末日を取得(EOMONTH)
ある月の末日を簡単に取得できる関数が EOMONTH です。
-- 今月末
SELECT EOMONTH(GETDATE());
-- 3ヶ月後の月末
SELECT EOMONTH(GETDATE(), 3);
-- 2025年2月の月末
SELECT EOMONTH('2025-02-10');
書式変換(CONVERT/FORMAT)
結果を見やすい文字列形式に整形するには CONVERT や FORMAT を使います。
-- CONVERTを使った例 (スタイルコード101: mm/dd/yyyy)
SELECT CONVERT(VARCHAR(10), GETDATE(), 101); -- 06/27/2025
-- FORMATを使った例 (日本語表記)
SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日 HH:mm:ss'); -- 2025年06月27日 14:35:00
- CONVERT は軽量で高速
- FORMAT は.NETの機能を使うため柔軟だが若干遅い
サンプルクエリ集
〇日前~〇日前のデータ取得
-- 7日前から今日までの注文を取得
SELECT *
FROM Orders
WHERE OrderDate BETWEEN DATEADD(day, -7, GETDATE()) AND GETDATE();
月初~月末のデータ取得
-- 今月の売上データ
SELECT *
FROM Sales
WHERE SaleDate BETWEEN
DATEADD(day, 1, EOMONTH(GETDATE(), -1)) -- 月初
AND EOMONTH(GETDATE()); -- 月末
1時間ごとの件数集計
SELECT
DATEPART(hour, LogTime) AS 時間帯,
COUNT(*) AS 件数
FROM AccessLog
WHERE LogTime >= DATEADD(day, -1, GETDATE())
GROUP BY DATEPART(hour, LogTime)
ORDER BY 時間帯;
まとめ
本記事では、SQL Serverで日付計算を行う際に押さえておきたい基本関数を解説しました。
- GETDATE()/SYSDATETIME():現在日時の取得
- DATEADD:日付の加減算
- DATEDIFF:日付の差分算出
- DATEPART:日付の一部を取得
- EOMONTH:月末日の取得
- CONVERT/FORMAT:書式変換
これらを組み合わせることで、さまざまなレポートや集計を実現可能です。まずはサンプルを試しながら、実務でよく使うパターンを自分のものにしていきましょう。
SQL Serverの日付計算は一度コツをつかめば非常に強力な武器になります。ぜひ本記事を参考に、より効率的なデータ分析・アプリケーション開発にお役立てください!