
SQL Serverで指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数を作ったので覚書しておく。
ユーザー定義関数の処理概要
基本的には、以下の記事でAccessのVBAで作成したユーザー定義関数のSQL Server版です。

Access VBA:指定した日付が休日(祝祭日、土日)かどうかをチェックするユーザー定義関数
AccessのVBAで指定した日付が休日(祝祭日、土日)かどうかを判定するためのユーザー定義関数を作成したので覚書しておく。OSの設定を和暦にしているとうまく動かないとの指摘があったので、和暦対応を追記しました。
ユーザー定義関数のプログラムだけでは祝祭日のチェックはできないので、別途祝祭日を管理するテーブル(holidayテーブル)を用意して事前に祝祭日の日付を入力しておく必要があります。
祝祭日、土日以外で会社がお休みになる日(創立記念日など)も入力しておいてください。
祝祭日がテーブルに入力されていることを前提として、ユーザー定義関数のプログラム処理としては以下のとおりです。
- 休日かどうかチェックしたい日付を引数として受け取ります。
- 受け取った引数の日付がholidayテーブルに存在するかをチェックします。
- 存在しない場合は、曜日を調べて土日かどうかをチェックします。
- 祝祭日もしくは、土日にあたる場合は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で実行してあげればユーザー定義関数が作成されます。


コメント