SQLSERVERは、指定された月の平日日数を算出します(国の法定休日は考慮せず、土日のみを除外します)

2976 ワード


--           (          ,       ,                       )
CREATE FUNCTION [dbo].[getCountOfWorkdaysOfMonth](@year_in NVARCHAR(4), @month_in NVARCHAR(2), @restDayStr NVARCHAR(100)) --year_in     ,month_in    ,@restDayStr       (     )
returns INT --          set datefirst 1    ,        1,   
AS
BEGIN
     IF(@year_in IS NULL OR @month_in IS NULL)
     BEGIN
          RETURN NULL
     END   

     DECLARE @firstDayOfMonth VARCHAR(10) --       yyyy-MM-dd  
     DECLARE @howManyDaysOfMonth INT --      
     DECLARE @dayCusor NUMERIC --        
     DECLARE @countOfWorkdaysOfMonth INT --        ,    0
     DECLARE @dayOfADay VARCHAR --                 
     DECLARE @dateOfADay DATETIME --               ,            
     
     SET @firstDayOfMonth = @year_in + '-' + @month_in + '-' + '01'
     SET @dateOfADay = CONVERT(DATETIME,@firstDayOfMonth,121)
		 SET @howManyDaysOfMonth = CAST(DAY(DATEADD(MONTH, DATEDIFF(MONTH, 0, @dateOfADay) + 1, 0) - 1) AS INT)

     IF (@restDayStr IS NOT NULL)
     BEGIN
          DECLARE @strLength INT
          DECLARE @charindexOfComma INT
          DECLARE @separator VARCHAR(1)
          DECLARE @countOfRestDaysOfMonth INT
          
          SET @separator = ','
          SET @charindexOfComma = CHARINDEX(@separator,@restDayStr)
          SET @strLength = LEN(@restDayStr)
          SET @countOfRestDaysOfMonth = 1
          SET @countOfWorkdaysOfMonth = @howManyDaysOfMonth - @countOfRestDaysOfMonth

          WHILE @charindexOfComma > 0
          BEGIN
               SET @countOfRestDaysOfMonth = @countOfRestDaysOfMonth + 1
               SET @restDayStr = SUBSTRING(@restDayStr, @charindexOfComma + 1, @strLength)
               SET @charindexOfComma = CHARINDEX(@separator,@restDayStr)
          END
          
          SET @countOfWorkdaysOfMonth = @howManyDaysOfMonth - @countOfRestDaysOfMonth
     END
     ELSE
     BEGIN
					 SET @countOfWorkdaysOfMonth = 0
					 SET @dayCusor = 1
					 
					 WHILE @dayCusor <= @howManyDaysOfMonth
					 BEGIN
								SET @dayOfADay = DATEPART(WEEKDAY,@dateOfADay)
								IF @dayOfADay <> '6' AND @dayOfADay <> '7'
								BEGIN
										 SET @countOfWorkdaysOfMonth = @countOfWorkdaysOfMonth + 1
								END
								SET @dateOfADay = @dateOfADay + 1
								SET @dayCusor = @dayCusor + 1
					 END
     END

     RETURN @countOfWorkdaysOfMonth
END


参照先:
http://wenku.baidu.com/link?url=fB3F0xZmwig9r2M_1pK4BGN6VcHPW6F3NZuABWU4ye6edhxEZQ0Tue5cOFJRzk1rMo6PPZ1iHdfACxCwRsPqAwzvheuvj7o_L994LQYArZS
http://www.cnblogs.com/xionglee/articles/1444916.html