【Oracle】日付から曜日を取得する方法|TO_CHAR D/DY/DAY・NLS設定・曜日別集計まで実務パターン解説

【Oracle】日付から曜日を取得する方法|TO_CHAR D/DY/DAY・NLS設定・曜日別集計まで実務パターン解説 Oracle

Oracleデータベースで「今日は何曜日か」「この日付は何曜日だったか」を取得したい場面は頻繁にあります。レポートの曜日列、曜日別の売上集計、営業日判定など、曜日の取得は実務の基本スキルです。

この記事では、TO_CHAR関数を使った曜日取得の全パターンを、書式の違い・言語設定・実務での応用例まで体系的に解説します。

この記事で分かること

  • D・DY・DAY の3つの書式の違いと使い分け
  • NLS_DATE_LANGUAGE で日本語・英語の曜日を切り替える方法
  • FM修飾子 で余分な空白を除去するテクニック
  • CASE文 を使った曜日番号→日本語変換
  • NEXT_DAY関数 で「次の○曜日」を取得する方法
  • GROUP BY で曜日別に集計する実務パターン
スポンサーリンク

TO_CHARで曜日を取得する3つの書式(D・DY・DAY)

Oracleで日付から曜日を取得するには、TO_CHAR関数に曜日用の書式モデルを指定します。曜日に関連する書式は3種類あり、それぞれ返す値が異なります。

書式 返す値 例(水曜日の場合) 用途
D曜日番号(1〜7)4集計・条件分岐・ソート
DY曜日の略称(日本語)/ WED(英語)省スペースな表示
DAY曜日のフルネーム水曜日(日本語)/ WEDNESDAY(英語)正式な帳票・レポート

DAY: 曜日をフルネームで取得する

SQL — DAYで曜日のフルネームを取得

SELECT
  TO_CHAR(SYSDATE, 'DAY') AS day_upper,
  TO_CHAR(SYSDATE, 'Day') AS day_initcap,
  TO_CHAR(SYSDATE, 'day') AS day_lower
FROM dual;

▼ 実行結果(NLS_LANGUAGE=JAPANESE の場合)

DAY_UPPER   DAY_INITCAP   DAY_LOWER
———-  ———–   ———
火曜日      火曜日        火曜日

大文字・小文字の制御

書式の大文字・小文字の表記がそのまま結果に反映されます。
'DAY'TUESDAY(全大文字)
'Day'Tuesday(先頭のみ大文字)
'day'tuesday(全小文字)
日本語環境では大文字・小文字の区別がないため、どれも同じ結果になります。英語環境でレポートを作成する場合に使い分けが重要です。なお、SYSDATEの詳細は「Oracleシステム日付を取得する方法」を参照してください。

DY: 曜日を略称で取得する

SQL — DYで曜日の略称を取得

SELECT
  TO_CHAR(TO_DATE('2026-03-04', 'YYYY-MM-DD'), 'DY') AS day_short
FROM dual;

▼ 実行結果

DAY_SHORT
———
水        (日本語環境の場合)
WED      (英語環境の場合)

D: 曜日番号(1〜7)を取得する

SQL — Dで曜日番号を取得

SELECT
  TO_CHAR(SYSDATE, 'D') AS day_num
FROM dual;

注意: Dの値はNLS_TERRITORYに依存する

Dが返す曜日番号は、セッションのNLS_TERRITORYパラメータによってどの曜日が「1」になるかが変わります

AMERICA: 日曜日=1, 月曜日=2, … 土曜日=7
JAPAN: 日曜日=1, 月曜日=2, … 土曜日=7
ISO標準(一部の欧州): 月曜日=1, … 日曜日=7

環境に依存しない曜日判定が必要な場合は、後述するCASE文での明示的な変換が安全です。

▼ 曜日番号の対応表(NLS_TERRITORY=AMERICA / JAPAN の場合)

D 1 2 3 4 5 6 7
曜日

NLS_DATE_LANGUAGEで曜日の言語を切り替える

デフォルトでは、曜日の言語はセッションのNLS_LANGUAGE設定に従います。TO_CHAR第3引数NLS_DATE_LANGUAGEを指定すると、セッション設定を変更せずに任意の言語で曜日を取得できます。

SQL — NLS_DATE_LANGUAGEで言語を切り替え

SELECT
  TO_CHAR(SYSDATE, 'DAY', 'NLS_DATE_LANGUAGE=JAPANESE') AS jp_day,
  TO_CHAR(SYSDATE, 'Day', 'NLS_DATE_LANGUAGE=AMERICAN') AS en_day,
  TO_CHAR(SYSDATE, 'Dy', 'NLS_DATE_LANGUAGE=AMERICAN') AS en_dy
FROM dual;

▼ 実行結果

JP_DAY     EN_DAY        EN_DY
———- ———–   —–
水曜日     Wednesday     Wed

日付フォーマットの詳しい解説は「Oracle日付フォーマットを変更する方法」を参照してください。

FM修飾子で曜日の余分な空白を除去する

DAY書式は、曜日名が固定幅になるように末尾に空白が埋め込まれます(最も長い曜日名に合わせる)。文字列結合やWHERE句での比較時に問題になることがあります。FM(Fill Mode)修飾子を付けると余分な空白を除去できます。

SQL — FM修飾子で空白を除去

SELECT
  '[' || TO_CHAR(SYSDATE, 'DAY')   || ']' AS with_pad,
  '[' || TO_CHAR(SYSDATE, 'fmDAY') || ']' AS no_pad
FROM dual;

▼ 実行結果(英語環境の場合)

WITH_PAD         NO_PAD
—————– ———–
[WEDNESDAY    ]  [WEDNESDAY]

日本語環境では曜日名の長さに差がないため影響は小さいですが、英語環境やマルチ言語対応のシステムではfmDAYを使うのが安全です。なお、FMは書式文字列内でトグル動作します。出現するたびにON→OFF→ON…と切り替わるため、1つの書式文字列で複数回使う場合は注意が必要です。

CASE文で曜日番号を日本語に変換する

曜日の表示言語(NLS_DATE_LANGUAGE)に依存せず、確実に日本語の曜日名を返したい場合は、Dで曜日番号を取得し、CASE文で明示的に変換する方法が有効です。

SQL — CASE文で曜日番号を日本語に変換

SELECT
  order_date,
  CASE TO_CHAR(order_date, 'D')
    WHEN '1' THEN '日'
    WHEN '2' THEN '月'
    WHEN '3' THEN '火'
    WHEN '4' THEN '水'
    WHEN '5' THEN '木'
    WHEN '6' THEN '金'
    WHEN '7' THEN '土'
  END AS day_of_week
FROM orders;

DECODE関数でも同じことができる

Oracle独自のDECODE関数でもCASE文と同等の変換が可能です。
DECODE(TO_CHAR(order_date, 'D'), '1','日', '2','月', '3','火', '4','水', '5','木', '6','金', '7','土')

ただし、SQL標準はCASE文です。他のRDBMSへの移植性を考慮するならCASE文を推奨します。

注意: D の値自体は NLS_TERRITORY に依存する

上記のCASE文はNLS_TERRITORY=AMERICAまたはJAPAN(日曜日=1)を前提としています。欧州など月曜日=1の環境では番号と曜日の対応が変わります。環境に完全に依存しない方法として、第3引数でNLS_TERRITORYを固定できます。

TO_CHAR(order_date, 'D', 'NLS_TERRITORY=AMERICA')

これにより、どの環境でも日曜日=1の統一された番号体系になります。

日付と曜日を組み合わせて表示する

SQL — 日付と曜日を組み合わせた表示パターン

SELECT
  -- パターン1: 2026/03/04(水)
  TO_CHAR(SYSDATE, 'YYYY/MM/DD') || '('
    || TO_CHAR(SYSDATE, 'DY') || ')' AS pattern1,

  -- パターン2: 2026年3月4日 水曜日
  TO_CHAR(SYSDATE, 'fmYYYY"年"MM"月"DD"日" DAY') AS pattern2,

  -- パターン3: Wednesday, March 4, 2026
  TO_CHAR(SYSDATE, 'fmDay, Month DD, YYYY',
    'NLS_DATE_LANGUAGE=AMERICAN') AS pattern3
FROM dual;

TO_CHARの書式モデルでは、ダブルクォートで囲んだ文字列がそのまま出力に含まれます。"年""月""日"のように日本語を埋め込めます。日付フォーマットの詳細は「Oracle日付フォーマットを変更する方法」、和暦表示については「Oracle日付を和暦で取得する方法」を参照してください。

NEXT_DAY関数で「次の○曜日」を取得する

NEXT_DAY関数は、指定日以降で最初に来る指定曜日の日付を返します。「次の月曜日」「来週の金曜日」のような日付を取得する場合に使います。

SQL — NEXT_DAYで次の指定曜日を取得

SELECT
  -- 次の月曜日
  NEXT_DAY(SYSDATE, '月曜日') AS next_monday,

  -- 次の金曜日
  NEXT_DAY(SYSDATE, '金曜日') AS next_friday,

  -- 英語環境の場合
  NEXT_DAY(SYSDATE, 'MONDAY') AS next_mon_en
FROM dual;

NEXT_DAYの第2引数はNLS_LANGUAGE依存

第2引数の曜日名は、セッションのNLS_LANGUAGEに合った言語で指定する必要があります。日本語環境なら'月曜日'、英語環境なら'MONDAY'です。

NEXT_DAY(SYSDATE, 2) のように数値(1〜7)でも指定可能ですが、数値の意味はNLS_TERRITORYに依存します。NLS非依存で週の開始日を取得するには、次のセクションで紹介するTRUNC(SYSDATE, 'IW')が安全です。

TRUNCで週の開始日(月曜日)を取得する

SQL — TRUNCで週の開始日を取得

SELECT
  SYSDATE AS today,

  -- ISO週の月曜日を取得(NLS_TERRITORY非依存)
  TRUNC(SYSDATE, 'IW') AS week_start_mon,

  -- NLS_TERRITORY依存の週開始日
  TRUNC(SYSDATE, 'D') AS week_start_nls
FROM dual;

TRUNC(date, 'IW')はISO標準に基づき常に月曜日を返します。TRUNC(date, 'D')NLS_TERRITORY依存の週開始日を返します。週単位の集計には'IW'を使うのが安全です。日付の切り捨てを使った月末取得は「Oracle月末を取得する方法」も参考になります。

【実務応用】曜日別にGROUP BYで集計する

売上データやアクセスログを曜日別に集計するパターンは実務でよく使います。ポイントは、Dで曜日番号を取得してソートに使い、表示用にDYを使うことです。日付の時刻部分を00:00にリセットしたい場合は「Oracle今日の0:00を取得する方法」を参照してください。

SQL — 曜日別の売上集計

SELECT
  TO_CHAR(order_date, 'DY') AS day_of_week,
  COUNT(*) AS order_count,
  SUM(amount) AS total_amount,
  ROUND(AVG(amount)) AS avg_amount
FROM orders
GROUP BY
  TO_CHAR(order_date, 'DY'),
  TO_CHAR(order_date, 'D')
ORDER BY
  TO_CHAR(order_date, 'D');

▼ 実行結果の例

DAY_OF_WEEK  ORDER_COUNT  TOTAL_AMOUNT  AVG_AMOUNT
———–  ———–  ————  ———-
日           45           1,234,500     27,433
月           78           2,156,000     27,641
火           82           2,345,600     28,605
水           80           2,098,000     26,225
木           76           2,034,200     26,766
金           91           2,876,300     31,608
土           63           1,789,400     28,403

平日・休日の判定

SQL — 平日・休日を判定して集計

SELECT
  CASE
    -- NLS_TERRITORY=AMERICA/JAPANの場合: 1=日, 7=土
    WHEN TO_CHAR(order_date, 'D', 'NLS_TERRITORY=AMERICA')
      IN ('1', '7') THEN '休日'
    ELSE '平日'
  END AS day_type,
  COUNT(*) AS order_count,
  SUM(amount) AS total_amount
FROM orders
GROUP BY
  CASE
    WHEN TO_CHAR(order_date, 'D', 'NLS_TERRITORY=AMERICA')
      IN ('1', '7') THEN '休日'
    ELSE '平日'
  END;

第3引数にNLS_TERRITORY=AMERICAを指定することで、どの環境でも日曜日=1、土曜日=7として判定できます。

書式モデルの早見表

書式 返す値 例(2026/3/4 水曜日) NLS依存
D曜日番号(1〜7)4NLS_TERRITORY
DY曜日略称 / WEDNLS_DATE_LANGUAGE
DAY曜日フルネーム水曜日 / WEDNESDAYNLS_DATE_LANGUAGE
fmDAY曜日フルネーム(空白除去)WEDNESDAYNLS_DATE_LANGUAGE
DD月の日(1〜31)04なし
DDD年の日(1〜366)063なし
IWISO週番号(1〜52/53)10なし

DD(月の日)とD(曜日番号)は紛らわしいので注意してください。DDDは年初からの通算日数です。

まとめ

Oracle 曜日取得のポイント

TO_CHAR(date, 'DAY') で曜日のフルネーム、'DY' で略称、'D' で番号を取得
NLS_DATE_LANGUAGE の第3引数で言語を明示指定(日本語↔英語)
FM修飾子 で DAY の末尾空白を除去(文字列結合時に重要)
✔ NLS依存を避けるなら CASE文 + D で明示的に変換
✔ 「次の○曜日」は NEXT_DAY関数、週の開始日は TRUNC(date, ‘IW’)
✔ 曜日別集計は GROUP BY TO_CHAR(date, ‘DY’) + ORDER BY TO_CHAR(date, ‘D’)

関連記事として、「Oracle日付フォーマットを変更する方法」「Oracleシステム日付を取得する方法」「Oracle日付を和暦で取得する方法」「Oracle月末を取得する方法」「Oracle今日の0:00を取得する方法」も参考にしてください。