MySQLで2つの日付の差を計算する方法
MySQLで2つの日付の差を計算するには、いくつかの方法があります。それぞれ異なる用途や利点があるので、状況に合わせて最適な方法を選択することが重要です。
DATEDIFF関数を使う
DATEDIFF関数は、2つの日付の差を日数で返す最もシンプルな方法です。
SELECT DATEDIFF('2023-10-05', '2023-11-14');
この例では、'2023-11-14' から '2023-10-05' までの日数が40であることが返されます。
利点:
- シンプルで分かりやすい
- 処理速度が速い
- 時刻の情報は考慮されない
- 月や年を跨いだ場合の差を正確に計算できない
TIMESTAMPDIFF関数を使う
TIMESTAMPDIFF関数は、2つの日付/時刻の差を指定した単位で返すことができます。年、月、週、日、時間、秒など様々な単位に対応しています。
SELECT TIMESTAMPDIFF(MONTH, '2023-05-01', '2024-01-01');
- DATEDIFF関数よりも柔軟性が高い
- 時刻の情報も考慮できる
- 複雑なクエリになる場合がある
DATE_SUB() と DATE_ADD() 関数を使う
DATE_SUB関数とDATE_ADD関数を使って、2つの日付の差を計算することもできます。
SELECT DATE_SUB('2024-01-01', INTERVAL DATEDIFF('2023-05-01', '2024-01-01') DAY);
この例では、'2024-01-01' から '2023-05-01' までの日数を計算し、その結果を引いて '2023-05-01' を返します。
- 柔軟性が高い
- 複雑な計算にも対応できる
- DATEDIFF関数やTIMESTAMPDIFF関数よりも処理速度が遅い
状況に応じた使い分け
- 単純な日数の差を知りたい場合は、DATEDIFF関数がおすすめです。
- 月や年、時間などの単位で差を知りたい場合は、TIMESTAMPDIFF関数がおすすめです。
- 複雑な計算が必要な場合は、DATE_SUB関数とDATE_ADD関数を組み合わせて使うことができます。
以下に、紹介したそれぞれの方法のサンプルコードをいくつか示します。
DATEDIFF関数を使う
-- 2023-11-14 から 2023-10-05 までの日数
SELECT DATEDIFF('2023-11-14', '2023-10-05');
-- 2024-01-01 から 2023-12-31 までの日数
SELECT DATEDIFF('2024-01-01', '2023-12-31');
TIMESTAMPDIFF関数を使う
-- 2024-01-01 から 2023-05-01 までの月の差
SELECT TIMESTAMPDIFF(MONTH, '2023-05-01', '2024-01-01');
-- 2024-01-01 13:00:00 から 2023-12-31 23:59:59 までの秒数
SELECT TIMESTAMPDIFF(SECOND, '2023-12-31 23:59:59', '2024-01-01 13:00:00');
DATE_SUB() と DATE_ADD() 関数を使う
-- 2024-01-01 から 2023-05-01 までの日数を計算して '2023-05-01' を返す
SELECT DATE_SUB('2024-01-01', INTERVAL DATEDIFF('2023-05-01', '2024-01-01') DAY);
-- 2023-12-31 から 2024-01-01 までの時間を '01:00:00' として加算して返す
SELECT DATE_ADD('2023-12-31', INTERVAL '01:00:00' HOUR);
- 上記はほんの一例です。状況に合わせて様々なクエリを組み合わせて使うことができます。
- 詳細については、MySQL公式ドキュメントを参照してください。
MySQLで2つの日付の差を計算するその他の方法
前述の方法に加えて、MySQLで2つの日付の差を計算する方法はいくつかあります。以下に、それぞれの方法の簡単な概要と、利点と欠点を示します。
SUBDATE() と ADDDATE() 関数を使う
SUBDATE関数とADDDATE関数を使用して、2つの日付の差を計算できます。
-- 2024-01-01 から 2023-05-01 までの日数を計算して '2023-05-01' を返す
SELECT SUBDATE('2024-01-01', INTERVAL DATEDIFF('2023-05-01', '2024-01-01') DAY);
-- 2023-12-31 に 1日を加算して '2024-01-01' を返す
SELECT ADDDATE('2023-12-31', INTERVAL 1 DAY);
PERIOD_DIFF() 関数を使う
PERIOD_DIFF関数は、2つの期間の差を月単位で返す関数です。
-- 2024-03-01 から 2023-11-01 までの月の差
SELECT PERIOD_DIFF('2023-11-01', '2024-03-01');
- 月の差を簡単に計算できる
- 日数や時間の差を計算できない
EXTRACT() 関数を使う
EXTRACT関数を使用して、2つの日付の差を年、月、週、日、時間、秒などの単位で抽出できます。
-- 2024-01-01 から 2023-12-31 までの月の差
SELECT EXTRACT(MONTH FROM INTERVAL '2024-01-01' - '2023-12-31');
-- 2024-01-01 13:00:00 から 2023-12-31 23:59:59 までの秒数
SELECT EXTRACT(SECOND FROM INTERVAL '2024-01-01 13:00:00' - '2023-12-31 23:59:59');
- 他の方法よりも処理速度が遅い場合がある
カスタム関数を使う
独自の要件を満たすために、カスタム関数を作成することもできます。
CREATE FUNCTION diff_in_days(date1 DATE, date2 DATE)
RETURNS INT
BEGIN
DECLARE days INT;
SET days = DATEDIFF(date2, date1);
RETURN days;
END;
-- 2024-01-01 から 2023-12-31 までの日数
SELECT diff_in_days('2023-12-31', '2024-01-01');
- 独自の要件に完全に準拠した方法で差を計算できる
- 開発とテストに時間がかかる
mysql sql date