🧚 お知らせ!Beekeeper Studioは高速でモダンなオープンソースのデータベースGUIです ダウンロード
2024年9月9日 著者: Matthew Rathbone

OracleのTO_CHAR()関数で平日を判定する

次の例では、TO_CHAR()を使って日付が平日にあたる行のみを返す方法を示します。

SELECT order_id, order_date
FROM orders
WHERE TO_CHAR(order_date, 'DY') NOT IN ('SAT', 'SUN');

出力例:

ORDER_ID | ORDER_DATE
---------|------------
1001     | 04-SEP-2023
1002     | 05-SEP-2023
1005     | 06-SEP-2023
1010     | 07-SEP-2023

このクエリでは:

  • TO_CHAR(order_date, 'DY')がorder_date列から曜日の略称を取り出します。
  • NOT IN ('SAT', 'SUN')句で、土曜日または日曜日にあたる行を除外します。

曜日の正式名を使う

データベースのロケールによって曜日の略称が異なる場合や、正式な曜日名を使いたい場合は、次のようにクエリを変更できます:

SELECT employee_id, work_date
FROM employee_schedule
WHERE TO_CHAR(work_date, 'DAY') NOT IN ('SATURDAY', 'SUNDAY');

出力例:

EMPLOYEE_ID | WORK_DATE
------------|-----------
200         | 01-SEP-2023
201         | 02-SEP-2023
202         | 03-SEP-2023

2つの日付の間の平日を抽出する

2つの日付の間のレコードを、平日分だけ取得したいこともよくあります。そのためにロジックを拡張する方法は次のとおりです。

クエリ例: 2つの日付の間の平日を抽出する

SELECT invoice_id, invoice_date
FROM invoices
WHERE invoice_date BETWEEN TO_DATE('2023-09-01', 'YYYY-MM-DD') 
                       AND TO_DATE('2023-09-10', 'YYYY-MM-DD')
AND TO_CHAR(invoice_date, 'DY') NOT IN ('SAT', 'SUN');

出力例:

INVOICE_ID | INVOICE_DATE
-----------|--------------
3001       | 01-SEP-2023
3005       | 04-SEP-2023
3007       | 05-SEP-2023
3010       | 06-SEP-2023

異なる言語やロケールへの対応

Oracleは、セッションのNLS(National Language Support)設定に基づいて曜日名を表示する場合があります。たとえば、セッションの言語が英語以外に設定されていると、‘MON’や‘TUE’といった曜日の略称が異なることがあります。現在の設定は次のコマンドで確認できます:

SELECT * FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TERRITORY';

必要に応じて、セッションレベルでこれらの設定を上書きし、一貫した結果を得ることができます:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';

これによりテリトリーが‘AMERICA’に設定され、‘MON’、‘TUE’などの曜日名が使われるようになります。

NEXT_DAY()関数を使う

指定した日付から次の平日を算出したい場合もあります。OracleのNEXT_DAY()関数を使うと、特定の曜日が次に来る日付を求められます。

クエリ例: 次の平日を求める

SELECT NEXT_DAY(SYSDATE, 'MONDAY') AS next_monday
FROM dual;

出力例:

NEXT_MONDAY
------------
11-SEP-2023

この例では、NEXT_DAY(SYSDATE, 'MONDAY')が現在の日付の次の‘Monday’を返します。

まとめ

Oracle SQLで平日を抽出することは、多くのアプリケーションでよくある要件です。TO_CHAR()関数で曜日を取り出して週末を除外すれば、平日のみを扱えます。より複雑なケースでは、NEXT_DAY()などの関数と日付範囲を組み合わせて、高度なクエリを作成できます。

こちらの記事もおすすめです:

Beekeeper Studioは無料のオープンソースのデータベースGUIです

これまで使った中で最高のSQLクエリ&エディタツールです。データベースの管理に必要なものがすべて揃っています。 - ⭐⭐⭐⭐⭐ Mit

Beekeeper Studioは高速で直感的、そして使いやすいツールです。多数のデータベースに対応し、Windows、Mac、Linuxで快適に動作します。

BeekeeperのLinux版は100%フル機能。手抜きも機能の妥協も一切ありません。

Beekeeper Studio 利用者の声

★★★★★
「Beekeeper Studioは、以前のSQLワークフローを完全に置き換えてくれました。高速で直感的で、データベース作業がまた楽しくなりました。」
— Alex K.、データベース開発者
★★★★★
「多くのデータベースGUIを試してきましたが、Beekeeperは機能とシンプルさのバランスが絶妙です。とにかくちゃんと動きます。」
— Sarah M.、フルスタックエンジニア