Oracle SQLで月初日、月末日、年初からの日数、今月の日数、今月の今日から月末日までの残日数、2つの日付の日数差、今日の深夜00時00分00秒からの経過秒数、今日の23時59分59秒までの残り秒数などを取得できるSQLです。Oracleデータベースを使う上で、様々な日付や時刻を計算して求める必要がある場合に重宝します。
この記事では日付を分かりやすくするために、以下のSQLで日付と時刻を読みやすいように変更しておきます。
-- 日時を分かりやすい表記に変更
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
当月の月初日
-- 当月の月初日を取得する
SELECT TRUNC(SYSDATE, 'MONTH') FROM DUAL;
TRUNC(SYSDATE,'MONT
-------------------
2025-07-01 00:00:00
当月の月初日を取得するには、TRUNC関数の引数に ‘MONTH’ を指定することで月より後の日付を切り捨てることが出来ます。2025-07-30の場合、’MONTH’ を指定することで月の後の日付(30)を切り捨てて ’01’ とすることが出来ます。これによって月初日を取得できます。
当月の最終日
-- 当月の最終日を取得する
SELECT TRUNC(LAST_DAY(SYSDATE)) FROM DUAL;
TRUNC(LAST_DAY(SYSD
-------------------
2025-07-31 00:00:00
LASTDAY関数を使うことで、月の最終日の日付を取得することが出来ます。しかし LAST_DAY(SYSDATE) だけを実行すると「2025-07-31 13:07:45」のように時刻が綺麗に揃わないため、時刻を切り捨てるためにTRUNC関数を使っています。
今年の最初の日
-- 今年の最初の日を取得する
SELECT TRUNC(SYSDATE, 'YEAR') FROM DUAL;
TRUNC(SYSDATE,'YEAR
-------------------
2025-01-01 00:00:00
今年の最初の日を取得するには、TRUNC関数の引数に ‘YEAR’ を指定することで年より後の日付を切り捨てることが出来ます。2025-07-30の場合、’YEAR’ を指定することで年の後の月(07)以降を切り捨てて ’01-01′ とすることが出来ます。これによって今年の最初の日を取得できます。
今年の最終日
-- 今年の最終日を取得する
SELECT ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), 12) - 1 FROM DUAL;
ADD_MONTHS(TRUNC(SY
-------------------
2025-12-31 00:00:00
今年の最終日を取得するには、まず現在日時(SYSDATE)の年以降を切り捨てて「2025-01-01」とします。その次にADD_MONTHS関数で12ヶ月を足すと、「2026-01-01」になります。ここから1日を引き算すると、「2025-12-31」というように今年の最終日を得ることが出来ます。
今月の日数
-- 今月の日数を取得する
SELECT CAST(TO_CHAR(LAST_DAY(SYSDATE), 'dd') AS INT) FROM DUAL;
CAST(TO_CHAR(LAST_DAY(SYSDATE)
------------------------------
31
今月の日数を取得するには、まず最初に LAST_DAY(SYSDATE) を実行することによって今月の最終日を取得します。例えば現在日時が「2025-07-15」であれば、「2025-07-31」という日付が得られます。次にこの日付から「日」だけを取得するためにCAST関数を使って’dd’を指定して「日」部分だけを取得します。「2025-07-31」から「日」だけを取得すると「31」となります。この31をINT方に変換してあげることで、今月の日数は31日間であることを取得できます。
今月の今日から月末日までの残日数
-- 今月の今日から月末日までの残日数を取得する
SELECT SYSDATE AS "現在日時", LAST_DAY(SYSDATE) "今月の最終日", LAST_DAY(SYSDATE) - SYSDATE AS "今月の残日数" FROM DUAL;
現在日時 今月の最終日 今月の残日数
------------------- ------------------- ------------
2025-07-22 01:00:34 2025-07-31 01:00:34 9
今月の今日から月末日までの残日数を取得するには、まず LAST_DAY(SYSDATE) で今月の月末日を求めます。この月末日から現在日付(SYSDATE)を引き算することで、今月の今日から月末日までの残日数を取得することが可能です。
2つの日付の日数差
-- 2つの日付の日数差を取得する
SELECT ROUND((MONTHS_BETWEEN('2025-01-01', '2024-01-01') * 30), 0) FROM DUAL;
ROUND((MONTHS_BETWEEN('2025-01
------------------------------
360
2つの日付の日数差を調べるには、MONTHS_BETWEEN関数を使います。MONTHS_BETWEEN関数によって、2つの日付の間の月数を得られます。「MONTHS_BETWEEN(‘2025-01-01’, ‘2024-01-01’)」の場合は、12ヶ月差がありますので「12」が返ります。この12ヶ月に30を掛けることで日数が得られます。
今日の曜日
-- 今日の曜日を取得する
SELECT TO_CHAR(SYSDATE, 'DAY') FROM DUAL;
TO_CHAR(SYSDATE,'DAY')
----------------------
火曜日
今日の曜日を得るには、TO_CHAR関数に ‘DAY’ を指定することで曜日が得られます。
今日の深夜00時00分00秒からの経過秒数
-- 今日の深夜00時00分00秒からの経過秒数を取得する
SELECT (SYSDATE - TRUNC(SYSDATE)) * 24 * 60 * 60 FROM DUAL;
(SYSDATE-TRUNC(SYSDATE))*24*60
------------------------------
3696
今日の深夜00時00分00秒からの経過秒数を得るには、まずTRUNC(SYSDATE)によって今日の時刻をすべて切り捨てます。例えば現在日時が「2025-07-31 13:47:21」であれば「2025-07-31 00:00:00」となります。現在日時から、得られた「2025-07-31 00:00:00」を引き算すると「.574548611」のような数値が得られます。「.574548611」は日付の差を表していますので、これに24時間を掛けて、更に60分を掛け、更に60秒を掛けることで秒数を取得しています。
今日の23時59分59秒までの残り秒数
-- 今日の23時59分59秒までの残り秒数を取得する
SELECT (TRUNC(SYSDATE + 1) - SYSDATE) * 24 * 60 * 60 FROM DUAL;
(TRUNC(SYSDATE+1)-SYSDATE)*24*
------------------------------
82689
今日の23時59分59秒までの残り秒数を取得する方法です。ここでは「2025-07-31 14:25:31」をSYSDATEの日付とします。まず「SYSDATE + 1」で明日の日付を取得します。すると明日ですので「2025-08-01 14:25:31」となります。明日の日付の時刻部分をTRUNC関数で切り捨てることで、「2025-08-01 00:00:00」が得られます。「(TRUNC(SYSDATE + 1) – SYSDATE)」によって、「2025-08-01 00:00:00」から「2025-07-31 14:25:31」を引き算すると、「.907881944」のように日数が得られます。これに24時間を掛けて、更に60分を掛け、更に60秒を掛けることで秒数を取得しています。その結果が現在日時から今日の23時59分59秒までの残り秒数を表しています。
まとめ
OracleのSQLでは、ここまで説明してきたようなSQL関数を組み合わせることによって様々な日付や時刻や秒数を得られます。