天天看點

sql如何計算兩個日期間的工作日,剔除節假日

建立 标量值函數,這個函數會傳回一個日期值, 然後就可以在存儲過程中調用了, 不過調用的方式有所不同, 如果不加 dbo,那sql會不認識這個函數, 即 SELECT   [dbo].[f_workdateadd]('2011-8-29',1,3)

定義節假日表

CREATE   TABLE   Holiday(

HDate   date   primary   key   clustered,   --節假日期

Name   nvarchar(50)   not   null)                    --假日名稱,或備注

GO

USE [PCMIS]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

alter function [dbo].[f_workdateadd](

@sndate date,  --産品投入日

@i int, --為1,開始的日期

@j int  --間隔的天數

)returns date

as

begin

declare @str date

declare @str2 date --與@str互相比較,取最大值

while (@i<[email protected])

begin

 if (dateadd(DAY,@i,@sndate)  in (select Hdate from Holiday)) --如果遇到節假日

   begin

     set @[email protected]+1 --如果遇到節假日,時間要延長

   end

   if (dateadd(DAY,@i,@sndate) not in (select Hdate from Holiday)) --沒有遇到節假日

   begin

     select @str=dateadd(DAY,@i,@sndate)

     if (@i=1) 

     begin

      set  @[email protected]

     end

     else

      if (@i>1)

      begin

        if (@str>@str2)

         set @[email protected]

      end

   end

     set @[email protected]+1

  end   

 return (@str2)

end

繼續閱讀