SQL Serverで日付計算をマスターしよう!初心者向けガイド

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)

結果を見やすい文字列形式に整形するには CONVERTFORMAT を使います。

-- 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の日付計算は一度コツをつかめば非常に強力な武器になります。ぜひ本記事を参考に、より効率的なデータ分析・アプリケーション開発にお役立てください!