SQL Server:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数

SQL Serverで指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数を作ったので覚書しておく。

スポンサーリンク

ユーザー定義関数の処理概要

基本的には、以下の記事でAccessのVBAで作成したユーザー定義関数のSQL Server版です。

Access VBA:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数
AccessのVBAで指定した日付が休日(祝祭日、土日)かどうかを判定するためのユーザー定義関数を作成したので覚書しておく。OSの設定を和暦にしているとうまく動かないとの指摘があったので、和暦対応を追記しました。

ユーザー定義関数のプログラムだけでは祝祭日のチェックはできないので、別途祝祭日を管理するテーブル(holidayテーブル)を用意して事前に祝祭日の日付を入力しておく必要があります。

祝祭日、土日以外で会社がお休みになる日(創立記念日など)も入力しておいてください。

祝祭日がテーブルに入力されていることを前提として、ユーザー定義関数のプログラム処理としては以下のとおりです。

  1. 休日かどうかチェックしたい日付を引数として受け取ります。
  2. 受け取った引数の日付がholidayテーブルに存在するかをチェックします。
  3. 存在しない場合は、曜日を調べて土日かどうかをチェックします。
  4. 祝祭日もしくは、土日にあたる場合はTrueを返し、そうでない場合はFalseを返します。

祝祭日を管理するテーブルの構造

祝祭日を管理するテーブル構造は以下のとおり。

テーブル名:holiday

フィールド名 データ型 入力する値
holiday datetime 祝祭日の日付
holiday_name varchar(20) 祝祭日名

注意点

holiday_nameフィールドを用意するかどうかは任意です。

祝祭日名については直接使われることはありません。

ユーザー定義関数を作成するスクリプト

以下、ユーザー定義関数を作成するスクリプト

/*USE [ユーザー定義関数を作成するDB名] に変更すること!*/
USE [test_db]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[ChecKHoliday] 
( 
    @dt DATETIME
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @checkdt datetime
DECLARE @flg int
/*時刻を含むデータが指定される場合を考慮して日付部分だけにする(時間を00:00:00)*/
set @dt = cast(CONVERT(char(10), @dt, 23) as datetime)
/*フラグ初期化*/
set @flg = 0
/*引数の日付が祝祭日テーブル(holiday)にあるかどうかチェック*/
set @checkdt = (select holiday from holiday where holiday=@dt)
/*Nullであれば祝祭日テーブルには登録されていない日付なので祝祭日ではない*/
if @checkdt is null
begin
/*次に土日かどうかチェック(1-日曜日,7-土曜日)*/
if datepart(weekday,@dt)=1 or datepart(weekday,@dt)=7
set @flg = 1
end
/*祝祭日*/
else
begin
set @flg = 1
end
RETURN @flg
    
END
  

上記スクリプトをSQL Serverで実行してあげればユーザー定義関数が作成されます。

コメント

タイトルとURLをコピーしました