SQL Serverで日付や時刻を扱う際によく使われる関数とその応用例を紹介します。
現在時刻の取得
SELECT
GETDATE() AS LocalTime, -- ローカル日時
SYSUTCDATETIME() AS UTCTime, -- 高精度UTC時刻
SYSDATETIMEOFFSET() AS OffsetTime, -- タイムゾーン付き時刻
CURRENT_TIMESTAMP AS StandardTime; -- 標準SQL互換
日付要素の分解
SELECT
DATEPART(YEAR, GETDATE()) AS 年,
DATEPART(MONTH, GETDATE()) AS 月,
DATEPART(DAY, GETDATE()) AS 日,
DATEPART(ISO_WEEK, GETDATE()) AS ISO週番号,
DATENAME(WEEKDAY, GETDATE()) AS 曜日名,
DATEPART(HOUR, GETDATE()) AS 時,
DATEPART(SECOND, GETDATE()) AS 秒;
日付の加算・減算
SELECT
DATEADD(DAY, 7, GETDATE()) AS 1週間後,
DATEADD(MONTH, -3, GETDATE()) AS 3ヶ月前,
DATEADD(YEAR, 5, GETDATE()) AS 5年後,
DATEADD(MINUTE, 90, GETDATE()) AS 90分後,
DATEADD(QUARTER, 1, GETDATE()) AS 次四半期;
期間差分の計算
DECLARE @開始日 DATETIME2 = '2024-04-01';
DECLARE @終了日 DATETIME2 = '2024-06-30';
SELECT
DATEDIFF(DAY, @開始日, @終了日) AS 日数差,
DATEDIFF(HOUR, @開始日, @終了日) AS 時間差,
DATEDIFF(QUARTER, @開始日, @終了日) AS 四半期差,
DATEDIFF(MINUTE, @開始日, @終了日) AS 分差;
日付の書式変換
SELECT
FORMAT(GETDATE(), 'yyyy年MM月dd日') AS 和風表示,
FORMAT(GETDATE(), 'ddd, MMM dd yyyy') AS 英語スタイル,
CONVERT(NVARCHAR, GETDATE(), 111) AS スラッシュ区切り,
CONVERT(NVARCHAR, GETDATE(), 112) AS 数値形式,
FORMAT(GETDATE(), 'HH:mm:ss.fff') AS 時分秒ミリ秒;
日付構築と月末処理
SELECT
DATEFROMPARTS(2025, 1, 1) AS 元旦,
SMALLDATETIMEFROMPARTS(2025, 7, 20, 15, 30) AS 夏の午後,
EOMONTH(GETDATE()) AS 今月末日,
EOMONTH(GETDATE(), -1) AS 前月末日,
DATEADD(DAY, 1, EOMONTH(GETDATE(), -1)) AS 今月1日;
日付妥当性チェックと条件分岐
SELECT
ISDATE('2025-02-29') AS 閏年判定_2025, -- 0(閏年でない)
ISDATE('2024-02-29') AS 閏年判定_2024, -- 1(閏年)
IIF(DATEPART(WEEKDAY, GETDATE()) BETWEEN 2 AND 6, '平日', '休日') AS 営業日判定;
実務で使えるクエリ例
-- 本日の注文を抽出
SELECT * FROM 注文テーブル
WHERE CAST(注文日時 AS DATE) = CAST(SYSDATETIME() AS DATE);
-- 直近30日の売上集計
SELECT SUM(金額) AS 最近一ヶ月売上
FROM 売上テーブル
WHERE 売上日 >= DATEADD(DAY, -30, CAST(SYSDATETIME() AS DATE));
-- 今年度のデータ(4月始まり)
SELECT *
FROM 財務データ
WHERE 売上日 >= DATEFROMPARTS(
CASE WHEN MONTH(GETDATE()) >= 4 THEN YEAR(GETDATE()) ELSE YEAR(GETDATE())-1 END,
4, 1)
AND 売上日 < DATEFROMPARTS(
CASE WHEN MONTH(GETDATE()) >= 4 THEN YEAR(GETDATE())+1 ELSE YEAR(GETDATE()) END,
4, 1);
-- 正確な年齢計算
SELECT
DATEDIFF(YEAR, 生年月日, GETDATE()) -
CASE WHEN MONTH(生年月日) > MONTH(GETDATE()) OR
(MONTH(生年月日) = MONTH(GETDATE()) AND DAY(生年月日) > DAY(GETDATE()))
THEN 1 ELSE 0 END AS 年齢
FROM 従業員マスタ;
時間帯操作
SELECT
CAST(SYSDATETIME() AS TIME) AS 現在時刻部分,
TIMEFROMPARTS(9, 0, 0, 0, 0) AS 定時開始,
DATEDIFF(SECOND, '08:30:00', '17:45:00') AS 勤務秒数,
DATEADD(HOUR, 18, CAST(CAST(GETDATE() AS DATE) AS DATETIME2)) AS 今日の夕方6時;