Transact-SQL
ユーザ定義関数(ファンクション)
前提条件として営業日を判断できるカレンダマスタが必要
<Mカレンダ>
[項目名] [型]
年月日 datetime
休日区分 tinyint
シンプル版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
-------------------------------------------------------------------------------------------------------------------------- --営業日取得 --内容:第一引数[日付]に対して、第二引数[日数]後の日付を取得 -------------------------------------------------------------------------------------------------------------------------- IF EXISTS (SELECT * FROM sys.objects WHERE type = 'FN ' AND name = 'func_BusinessDate') DROP FUNCTION func_BusinessDate GO CREATE FUNCTION [func_BusinessDate] ( @ArgDate Date ,@AddBusinessDay smallint ) Returns Date As Begin -- ローカル変数を宣言 Declare @DateValue Date -- 営業日求める IF @AddBusinessDay = 0 --ゼロの場合 SET @DateValue = @ArgDate ELSE IF @AddBusinessDay >= 1 --プラスの場合 SELECT @DateValue = MAX(DDD.年月日) FROM ( SELECT TOP (@AddBusinessDay) 年月日 FROM [Mカレンダ] WHERE 休日区分 = 0 AND 年月日 > @ArgDate ORDER BY 年月日 ) DDD; ELSE --マイナスの場合 SELECT @DateValue = MIN(DDD.年月日) FROM ( SELECT TOP (- (@AddBusinessDay-1) ) 年月日 FROM [Mカレンダ] WHERE 休日区分 = 0 AND 年月日 <= @ArgDate ORDER BY 年月日 DESC ) DDD; -- 戻り値セット Return (@DateValue) End |
日付取得後チェックがある版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
-------------------------------------------------------------------------------------------------------------------------- --営業日取得 --内容:第一引数[日付]に対して、第二引数[日数]後の日付を取得 -- :日付チェック① → 前月となる場合は当月の第一営業日をセット -- :日付チェック② → 過去の日付になる場合は当日をセット -------------------------------------------------------------------------------------------------------------------------- IF EXISTS (SELECT * FROM sys.objects WHERE type = 'FN ' AND name = 'func_BusinessDate2') DROP FUNCTION func_BusinessDate2 GO CREATE FUNCTION [func_BusinessDate2] ( @ArgDate Date ,@AddBusinessDay smallint ) Returns Date As Begin -- ローカル変数を宣言 Declare @DateValue Date -- 営業日求める IF @AddBusinessDay = 0 --ゼロの場合 SET @DateValue = @ArgDate ELSE IF @AddBusinessDay >= 1 --プラスの場合 SELECT @DateValue = MAX(DDD.年月日) FROM ( SELECT TOP (@AddBusinessDay) 年月日 FROM [Mカレンダ] WHERE 休日区分 = 0 AND 年月日 > @ArgDate ORDER BY 年月日 ) DDD; ELSE --マイナスの場合 SELECT @DateValue = MIN(DDD.年月日) FROM ( SELECT TOP (- (@AddBusinessDay-1) ) 年月日 FROM [Mカレンダ] WHERE 休日区分 = 0 AND 年月日 <= @ArgDate ORDER BY 年月日 DESC ) DDD; ------------------------------------------------------------- --日付チェック① → 前月となる場合は当月の第一営業日をセット IF DATEDIFF(MONTH, @ArgDate, @DateValue) < 0 --当月の第一営業日をセット SELECT @DateValue = MIN(DDD.年月日) FROM ( SELECT TOP (1) 年月日 FROM [Mカレンダ] WHERE 休日区分 = 0 AND CONVERT(VARCHAR(6), 年月日, 112) = CONVERT(VARCHAR(6), GETDATE(), 112) ORDER BY 年月日 ) DDD; --日付チェック② → 過去の日付になる場合は当日をセット IF @DateValue < CONVERT(date, GETDATE()) SET @DateValue = CONVERT(date, GETDATE()) -- 戻り値セット Return (@DateValue) End |
Comments are closed.