この記事では、Oracleデータベースにおける日時関連のファンクションである ADD_MONTHS, MONTHS_BETWEEN, NEXT_DAY, LAST_DAY, SYSDATE について、より具体的な使用例と注意点を含めて詳しく解説します。これらのファンクションは、データを処理する上で役立つ基本の機能を提供します。
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
1. ADD_MONTHS
ADD_MONTHS(date, n) は、指定した日付からnヶ月前または後の日付を返します。nが負の値の場合は過去の日付、正の値の場合は未来の日付を計算します。
使用例
移動前の日付: 2025-01-15
SELECT ADD_MONTHS(TO_DATE('2025-01-15', 'YYYY-MM-DD'), 3) AS result FROM dual;
SELECT ADD_MONTHS(TO_DATE('2025-01-15', 'YYYY-MM-DD'), -2) AS result FROM dual;
SQL> SELECT ADD_MONTHS(TO_DATE('2025-01-15', 'YYYY-MM-DD'), 3) AS result FROM dual;
RESULT
--------
25-04-15
SQL> SELECT ADD_MONTHS(TO_DATE('2025-01-15', 'YYYY-MM-DD'), -2) AS result FROM dual;
RESULT
--------
24-11-15
注意点
- 入力した日付が月末の場合、移動先の日付も月末に調整されます。
SELECT ADD_MONTHS(TO_DATE('2025-02-20', 'YYYY-MM-DD'), 1) AS result FROM dual;
SQL> SELECT ADD_MONTHS(TO_DATE('2025-02-20', 'YYYY-MM-DD'), 1) AS result FROM dual;
RESULT
--------
25-03-20
実践例
例えば、顧客のサブスクリプション期間を計算する際に使用できます。
SELECT customer_id, ADD_MONTHS(subscription_start_date, 12) AS subscription_end_date
FROM customers;
2. MONTHS_BETWEEN
MONTHS_BETWEEN(date1, date2) は、二つの日付の間の月数を返します。結果は実数で返され、小数部は日数の差を基に計算されます。
使用例
SELECT MONTHS_BETWEEN(TO_DATE('2025-04-15', 'YYYY-MM-DD'), TO_DATE('2025-01-15', 'YYYY-MM-DD')) AS result FROM dual;
SELECT MONTHS_BETWEEN(TO_DATE('2025-01-15', 'YYYY-MM-DD'), TO_DATE('2025-04-15', 'YYYY-MM-DD')) AS result FROM dual;
SQL> SELECT MONTHS_BETWEEN(TO_DATE('2025-04-15', 'YYYY-MM-DD'), TO_DATE('2025-01-15', 'YYYY-MM-DD')) AS result FROM dual;
RESULT
----------
3
SQL> SELECT MONTHS_BETWEEN(TO_DATE('2025-01-15', 'YYYY-MM-DD'), TO_DATE('2025-04-15', 'YYYY-MM-DD')) AS result FROM dual;
RESULT
----------
-3
注意点
- 年と月が同じで日が異なる場合、日数の違いが小数部に反映されます。
SELECT MONTHS_BETWEEN(TO_DATE('2024-01-31', 'YYYY-MM-DD'), TO_DATE('2024-01-01', 'YYYY-MM-DD')) AS result FROM dual;
-- 結果: 約1 (30日分が加算されます)
応用例
例えば、ローン返済の期間を計算する際に使用します。
SELECT loan_id, MONTHS_BETWEEN(payment_due_date, loan_start_date) AS repayment_period
FROM loans;
3. NEXT_DAY
NEXT_DAY(date, weekday) は、指定した日付から次の指定の曜日の日付を返します。曜日は文字列で指定します。
使用例
移動前の日付: 2024-01-15 (月曜日)
SELECT NEXT_DAY(TO_DATE('2025-01-15', 'YYYY-MM-DD'), '金') AS result FROM dual;
SQL> SELECT NEXT_DAY(TO_DATE('2025-01-15', 'YYYY-MM-DD'), '金') AS result FROM dual;
RESULT
--------
25-01-17
注意点
- 曜日指定はデータベースの言語設定に依存します。
- 英語環境の場合、使用可能な曜日: ‘SUNDAY’, ‘MONDAY’, ‘TUESDAY’, ‘WEDNESDAY’, ‘THURSDAY’, ‘FRIDAY’, ‘SATURDAY’
実践例
次回の支払い日を計算する際に役立ちます。
SELECT customer_id, NEXT_DAY(payment_date, '金') AS next_payment_date
FROM payments;
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?
4. LAST_DAY
LAST_DAY(date) は、指定した日付が含まれる月の最後の日付を返します。
使用例
SELECT LAST_DAY(TO_DATE('2025-01-15', 'YYYY-MM-DD')) AS result FROM dual;
SELECT LAST_DAY(TO_DATE('2025-02-10', 'YYYY-MM-DD')) AS result FROM dual;
SQL> SELECT LAST_DAY(TO_DATE('2025-01-15', 'YYYY-MM-DD')) AS result FROM dual;
RESULT
--------
25-01-31
SQL> SELECT LAST_DAY(TO_DATE('2025-02-10', 'YYYY-MM-DD')) AS result FROM dual;
RESULT
--------
25-02-28
注意点
- 入力日付が閏年の2月に該当する場合、正しい最後の日付を計算します。
応用例
例えば、月末の締め処理を計算する際に使用します。
SELECT employee_id, LAST_DAY(payment_date) AS payroll_cutoff_date
FROM payroll;
5. SYSDATE
SYSDATEは、クエリー実行時点のデータベースサーバーの現在の日時を返します。
使用例
SELECT SYSDATE AS result FROM dual;
SELECT SYSDATE + 7 AS next_week FROM dual;
SQL> SELECT SYSDATE AS result FROM dual;
RESULT
--------
25-11-15
SQL> SELECT SYSDATE + 7 AS next_week FROM dual;
NEXT_WEE
--------
25-11-22
注意点
- SYSDATEの結果はデータベースサーバーのタイムゾーンに基づきます。
- クライアントのタイムゾーンと異なる場合があるため、注意が必要です。
応用例
例えば、今日の日付を基準にしたプロモーション期間の設定。
SELECT SYSDATE AS today, SYSDATE + 30 AS promotion_end_date
FROM dual;
FAQ
Q: NEXT_DAYで無効な曜日を指定した場合どうなりますか?
A: エラーが発生します。曜日はデータベースの言語設定に依存するため、設定を確認してください。
Q: ADD_MONTHSで負の値を指定した場合の動作は?
A: 負の値を指定すると過去の日付が計算されます。月末調整も適用されます。
まとめ
これらのファンクションは日時情報の処理に対して強力なツールです。各ファンクションのロジックを理解して、実際のビジネスシーンに引き添えてみてください。また、使用時にはタイムゾーンやデータベースの言語設定などの環境依存要素に注意することが重要です。視覚的な表現や実践例を通じて、さらなる活用を目指してください。
[参考]
Oracle Database SQL言語リファレンス 19c
💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?
Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?




コメント