转自:edobnet

在日常开发中,有时候需要扣除节假日,本人实际开发中使用了一套比较好的办法与大家讨论.
表结构ER设计如下:
[转]扣除节假日高效算法

其中:节假日表,是存计算好的节假日结果.并且把日期换成"整形日期",建立索引提高判断速度,
只要节假日,变成,当晚就可以通过DTS最新计算节假日表,
存储过程如下:

[转]扣除节假日高效算法CREATE   Procedure sp_holiday
[转]扣除节假日高效算法    
@YEAR int
[转]扣除节假日高效算法
AS
[转]扣除节假日高效算法    
--产生节假日数据
[转]扣除节假日高效算法
    --exec sp_holiday 2005
[转]扣除节假日高效算法
    SET NOCOUNT ON
[转]扣除节假日高效算法    
[转]扣除节假日高效算法    
--判断是否需要计算
[转]扣除节假日高效算法
    IF (SELECT SET_IS_REDO FROM TJ_SETTINGS WHERE SET_YEAR = @YEAR= 1
[转]扣除节假日高效算法    
BEGIN
[转]扣除节假日高效算法    
[转]扣除节假日高效算法        
BEGIN TRAN
[转]扣除节假日高效算法        
[转]扣除节假日高效算法        
DELETE FROM TJ_HOLIDAY WHERE HOL_YEAR = @YEAR
[转]扣除节假日高效算法        
DECLARE @SQL VARCHAR(100), @THIS_DATE SMALLDATETIME@BEGIN_DATE SMALLDATETIME@END_DATE SMALLDATETIME@HOL_NAME VARCHAR(50), @INDEX TINYINT@IS_WEEK TINYINT
[转]扣除节假日高效算法        
--初始化双休日数据
[转]扣除节假日高效算法
        CREATE TABLE #WEEK (WEEK_DAY TINYINT PRIMARY KEY NOT NULL, IS_WEEK TINYINT NULL)
[转]扣除节假日高效算法        
SET @INDEX = 0
[转]扣除节假日高效算法        
WHILE (@INDEX < 7)
[转]扣除节假日高效算法        
BEGIN
[转]扣除节假日高效算法            
SET @SQL = 'INSERT INTO #WEEK (WEEK_DAY, IS_WEEK) SELECT ' + CAST(@INDEX AS CHAR(1)) + ', WK_' + CAST(@INDEX AS CHAR(1)) + ' FROM TJ_WEEK WHERE WK_YEAR = ' + CAST(@YEAR AS CHAR(4))
[转]扣除节假日高效算法            
EXEC(@SQL)
[转]扣除节假日高效算法            
SET @INDEX = @INDEX + 1
[转]扣除节假日高效算法        
END
[转]扣除节假日高效算法        
--每一天判断
[转]扣除节假日高效算法
        SET @BEGIN_DATE = CONVERT(SMALLDATETIMECAST(@YEAR AS CHAR(4)) + '-01-01'120)
[转]扣除节假日高效算法        
SET @END_DATE = DATEADD(YEAR1@BEGIN_DATE)
[转]扣除节假日高效算法        
SET @THIS_DATE = @BEGIN_DATE
[转]扣除节假日高效算法        
WHILE (@THIS_DATE < @END_DATE)
[转]扣除节假日高效算法        
BEGIN
[转]扣除节假日高效算法            
--非节假日
[转]扣除节假日高效算法
            IF EXISTS (SELECT * FROM TJ_NONFERIA WHERE NFR_YEAR = @YEAR AND NFR_DATE = @THIS_DATE)
[转]扣除节假日高效算法            
begin
[转]扣除节假日高效算法                
SET @THIS_DATE = DATEADD(DAY1@THIS_DATE)
[转]扣除节假日高效算法                
CONTINUE
[转]扣除节假日高效算法            
end
[转]扣除节假日高效算法            
--节日
[转]扣除节假日高效算法
            ELSE IF EXISTS (SELECT * FROM TJ_FERIA WHERE FER_YEAR = @YEAR AND FER_DATE = @THIS_DATE)
[转]扣除节假日高效算法            
BEGIN
[转]扣除节假日高效算法                
SELECT @HOL_NAME = FER_NAME FROM TJ_FERIA WHERE FER_YEAR = @YEAR AND FER_DATE = @THIS_DATE
[转]扣除节假日高效算法                
INSERT INTO TJ_HOLIDAY (HOL_YEAR, HOL_DATE_INT, HOL_DATE, HOL_NAME) 
[转]扣除节假日高效算法                
VALUES (@YEARFLOOR(CONVERT(FLOAT@THIS_DATE)), @THIS_DATE@HOL_NAME)
[转]扣除节假日高效算法            
END
[转]扣除节假日高效算法            
--休息日
[转]扣除节假日高效算法
            ELSE
[转]扣除节假日高效算法            
BEGIN
[转]扣除节假日高效算法                
SELECT @IS_WEEK = IS_WEEK FROM #WEEK WHERE WEEK_DAY = (DATEPART(WEEKDAY, @THIS_DATE- 1)
[转]扣除节假日高效算法                
IF (@IS_WEEK > 0)
[转]扣除节假日高效算法                    
INSERT INTO TJ_HOLIDAY (HOL_YEAR, HOL_DATE_INT, HOL_DATE, HOL_NAME) 
[转]扣除节假日高效算法                    
VALUES (@YEARFLOOR(CONVERT(FLOAT@THIS_DATE)), @THIS_DATEDATENAME(WEEKDAY, @THIS_DATE))
[转]扣除节假日高效算法            
END
[转]扣除节假日高效算法            
SET @THIS_DATE = DATEADD(DAY1@THIS_DATE)
[转]扣除节假日高效算法        
END
[转]扣除节假日高效算法        
[转]扣除节假日高效算法        
--重新设置计算标记
[转]扣除节假日高效算法
        UPDATE TJ_SETTINGS SET SET_IS_REDO = 0 WHERE SET_YEAR = @YEAR
[转]扣除节假日高效算法        
[转]扣除节假日高效算法        
IF @@ERROR = 0
[转]扣除节假日高效算法            
COMMIT TRAN
[转]扣除节假日高效算法        
ELSE 
[转]扣除节假日高效算法            
ROLLBACK TRAN
[转]扣除节假日高效算法        
[转]扣除节假日高效算法        
DROP TABLE #WEEK
[转]扣除节假日高效算法    
[转]扣除节假日高效算法    
END
[转]扣除节假日高效算法    
[转]扣除节假日高效算法    
SET NOCOUNT OFF
[转]扣除节假日高效算法
[转]扣除节假日高效算法
GO
[转]扣除节假日高效算法

节假日扣除函数如下:

[转]扣除节假日高效算法
[转]扣除节假日高效算法
[转]扣除节假日高效算法
[转]扣除节假日高效算法
CREATE    FUNCTION risk.CalcDay
[转]扣除节假日高效算法(
[转]扣除节假日高效算法    
@Diff smallint,        --差别值.正数为加,负数减
[转]扣除节假日高效算法
    @D_Date datetime      --差别日期
[转]扣除节假日高效算法
)
[转]扣除节假日高效算法
RETURNS datetime
[转]扣除节假日高效算法
AS
[转]扣除节假日高效算法    
BEGIN
[转]扣除节假日高效算法        
declare @ordDate datetime
[转]扣除节假日高效算法        
set @ordDate = @D_Date
[转]扣除节假日高效算法        
set @D_Date = convert(char(10), @D_Date120)  --去掉时间部分(防止传入的参数中有时间部分,影响处理)
[转]扣除节假日高效算法
        if @Diff > 0
[转]扣除节假日高效算法        
begin
[转]扣除节假日高效算法            
while @Diff > 0
[转]扣除节假日高效算法            
begin
[转]扣除节假日高效算法                
select @D_Date = @D_Date + @Diff@Diff = count(*from TJ_HOLIDAY 
[转]扣除节假日高效算法                
where HOL_DATE_INT > FLOOR(CONVERT(FLOAT@D_Date)) AND HOL_DATE_INT <= FLOOR(CONVERT(FLOAT@D_Date + @Diff))
[转]扣除节假日高效算法            
end
[转]扣除节假日高效算法        
end
[转]扣除节假日高效算法        
else
[转]扣除节假日高效算法        
begin
[转]扣除节假日高效算法            
while @Diff < 0
[转]扣除节假日高效算法            
begin
[转]扣除节假日高效算法                
select @D_Date = @D_Date + @Diff@Diff =- count(*from TJ_HOLIDAY 
[转]扣除节假日高效算法                
where HOL_DATE_INT < FLOOR(CONVERT(FLOAT@D_Date)) AND HOL_DATE_INT >= FLOOR(CONVERT(FLOAT@D_Date + @Diff))
[转]扣除节假日高效算法            
end
[转]扣除节假日高效算法        
end
[转]扣除节假日高效算法    
set @D_Date = dateadd(hour,datepart(hour,@ordDate),@D_Date)
[转]扣除节假日高效算法    
set @D_Date = dateadd(minute,datepart(minute,@ordDate),@D_Date)
[转]扣除节假日高效算法    
set @D_Date = dateadd(second,datepart(second,@ordDate),@D_Date)
[转]扣除节假日高效算法    
return(@D_Date)
[转]扣除节假日高效算法    
END
[转]扣除节假日高效算法
[转]扣除节假日高效算法
[转]扣除节假日高效算法
[转]扣除节假日高效算法
[转]扣除节假日高效算法
[转]扣除节假日高效算法


这样就可以使用了,dbo.CaclDay(-5,getdate())就是扣除节假以后的5天前的数据

希望对大家有帮助

相关文章:

  • 2021-05-29
  • 2022-12-23
  • 2021-12-03
  • 2022-01-16
  • 2022-12-23
  • 2021-06-19
  • 2021-12-05
猜你喜欢
  • 2021-09-11
  • 2022-12-23
  • 2022-12-23
  • 2021-11-13
  • 2022-12-23
  • 2021-09-29
  • 2021-08-17
相关资源
相似解决方案