COUNT関数とDATEDIFF関数を使って営業日数を数える

2024-04-08

SQLで2つの日付間の営業日数を数える

必要なもの

  • SQL Server Management Studio (SSMS) またはその他の SQL クエリ エディタ
  • テーブル Holidays (オプション)

手順

  1. 営業日カレンダーを作成する

まず、営業日と休日の情報を含むテーブルが必要です。このテーブルは、手動で作成することも、スクリプトを使用して生成することもできます。

CREATE TABLE Holidays (
  Date date NOT NULL,
  IsHoliday bit NOT NULL
);

例:

INSERT INTO Holidays (Date, IsHoliday) VALUES
('2024-01-01', 1),
('2024-01-15', 1),
('2024-12-25', 1),
('2024-12-31', 1);
  1. 2つの日付間の営業日数を数える

次のクエリは、2つの日付間の営業日数を数えます。

SELECT COUNT(*) AS WorkDays
FROM (
  SELECT Date
  FROM Calendar
  WHERE Date BETWEEN @StartDate AND @EndDate
  AND NOT EXISTS (SELECT * FROM Holidays WHERE Date = Calendar.Date)
) AS WorkDays;

このクエリは、まず Calendar テーブルから開始日と終了日の間のすべての日期を取得します。次に、Holidays テーブルを使用して、取得した日付のうち休日を除外します。最後に、残りの日付の数を数えます。

パラメータ:

  • @StartDate: 開始日
  • @EndDate: 終了日

例:

DECLARE @StartDate date = '2024-04-01';
DECLARE @EndDate date = '2024-04-15';

SELECT COUNT(*) AS WorkDays
FROM (
  SELECT Date
  FROM Calendar
  WHERE Date BETWEEN @StartDate AND @EndDate
  AND NOT EXISTS (SELECT * FROM Holidays WHERE Date = Calendar.Date)
) AS WorkDays;

このクエリは、2024年4月1日から2024年4月15日までの営業日数を返します。

注意事項

  • このクエリは、日曜日は休日と仮定しています。
  • 祝日が土曜日または日曜日の場合は、手動で調整する必要があります。
  • より複雑な要件の場合は、より複雑なクエリが必要になる場合があります。



コード:

USE [YourDatabase]

-- テーブル作成
CREATE TABLE Holidays (
  Date date NOT NULL,
  IsHoliday bit NOT NULL
);

-- 祝日データ挿入
INSERT INTO Holidays (Date, IsHoliday) VALUES
('2024-01-01', 1),
('2024-01-15', 1),
('2024-12-25', 1),
('2024-12-31', 1);

-- 営業日カレンダー作成
CREATE TABLE Calendar (
  Date date NOT NULL
);

-- 2024年のすべての日期を挿入
DECLARE @StartDate date = '2024-01-01';
DECLARE @EndDate date = '2024-12-31';

WHILE @StartDate <= @EndDate
BEGIN
  INSERT INTO Calendar (Date)
  VALUES (@StartDate);

  SET @StartDate = DATEADD(@StartDate, DAY, 1);
END;

-- 2つの日付間の営業日数を数える
DECLARE @StartDate date = '2024-04-01';
DECLARE @EndDate date = '2024-04-15';

SELECT COUNT(*) AS WorkDays
FROM (
  SELECT Date
  FROM Calendar
  WHERE Date BETWEEN @StartDate AND @EndDate
  AND NOT EXISTS (SELECT * FROM Holidays WHERE Date = Calendar.Date)
) AS WorkDays;

出力:

WorkDays
-------
10



2つの日付間の営業日数を数える他の方法

カレンダーテーブルを使用する

事前に作成されたカレンダーテーブルを使用する方法があります。このテーブルには、すべての日期とそれが営業日かどうかを示すフラグが含まれています。

SELECT COUNT(*) AS WorkDays
FROM Calendar
WHERE Date BETWEEN @StartDate AND @EndDate
AND IsHoliday = 0;

メリット:

  • シンプルでわかりやすい
  • 高速に実行できる
  • カレンダーテーブルを事前に作成する必要がある
  • 祝日の追加や削除が難しい

T-SQL の関数を使用する

T-SQL には、営業日数を計算する関数があります。

  • DATEADD 関数: 指定された日付に営業日数を追加または減算します。
  • DATEDIFF 関数: 2つの日付間の営業日数の差を計算します。
SELECT DATEDIFF(dd, @StartDate, @EndDate) - COUNT(Date) AS WorkDays
FROM Calendar
WHERE Date BETWEEN @StartDate AND @EndDate
AND IsHoliday = 1;
  • コードが簡潔になる
  • 複雑な要件には対応できない

ユーザー定義関数を作成する

複雑な要件の場合は、ユーザー定義関数を作成することができます。

CREATE FUNCTION [dbo].[GetWorkDays]
(
  @StartDate date,
  @EndDate date
)
RETURNS int
AS
BEGIN
  DECLARE @WorkDays int = 0;

  WHILE @StartDate <= @EndDate
  BEGIN
    IF NOT EXISTS (SELECT * FROM Holidays WHERE Date = @StartDate)
    BEGIN
      SET @WorkDays = @WorkDays + 1;
    END

    SET @StartDate = DATEADD(@StartDate, DAY, 1);
  END

  RETURN @WorkDays;
END;

SELECT [dbo].[GetWorkDays]('2024-04-01', '2024-04-15');
  • コードを再利用できる
  • 開発に時間がかかる
  • シンプルな方法で十分な場合は、カレンダーテーブルを使用する方法がおすすめです。


sql t-sql date


結合条件とWHERE句、パフォーマンスと読みやすさの天秤:最適なSQLクエリ設計

SQLクエリにおいて、複数のテーブルを結合してデータを取得する際、結合条件とWHERE句のどちらでフィルタリングを行うべきか疑問に思うことがあります。パフォーマンス面において、どちらが高速なのかを知りたいですよね。本記事では、"sql", "sql-server", "t-sql" に関連するこの問題について、分かりやすく解説します。...


PostgreSQLでハイフンをエスケープする2つの方法 - バックスラッシュと単一引用符

エスケープシーケンスの種類PostgreSQLでは、ハイフン (-) をエスケープする2つの方法があります。バックスラッシュ ()最も一般的な方法で、バックスラッシュ () をハイフンの前に配置します。例えば、以下のようになります。このクエリは、"This is a -example" という文字列を返すことになります。...


MySQLで本日日付より大きいまたは同等のDATETIMEを簡単に見つける

CURDATE() 関数と比較演算子を用いる最もシンプルな方法は、CURDATE() 関数で本日日付を取得し、比較演算子を用いて DATETIME 列と比較する方法です。このクエリは、your_table テーブルのすべてのレコードのうち、your_datetime_column の値が本日日付(CURDATE()) より大きいまたは同等なものをすべて選択します。...


PostgreSQLで過去10日間のレコードを抽出!WHERE句とdate_trunc関数を使いこなそう

このチュートリアルでは、PostgreSQLを使用して過去10日間のレコードを一覧表示する2つの方法を説明します。方法1:WHERE句とCURRENT_DATE関数を使用するこの方法は、CURRENT_DATE関数を使用して現在の日付を取得し、WHERE句で比較することで過去10日間のレコードを抽出します。...


Rails開発者必見!生SQLクエリを使いこなしてパフォーマンスを向上させる

ここでは、Railsで生SQLクエリを実行する代表的な方法と、それぞれの例について解説します。executeメソッドは、任意のSQLクエリを実行する最もシンプルな方法です。find_by_sqlメソッドは、SELECTクエリを実行し、結果をActiveRecordオブジェクトの配列として返します。...