sql 节假日判断(春节、中秋、国庆、周末等)

  1. set ANSI_NULLS ON  
  2. set QUOTED_IDENTIFIER ON  
  3. go  
  4.   
  5.   
  6. -- 日期检测函数,返回相关节假日  
  7. -- 0 非假日  
  8. -- 农历相关假日  
  9. -- 1 春节(正月初一 至 正月初七)  
  10. -- 2 端午节(五月五日)  
  11. -- 4 中秋节(八月十五)  
  12.   
  13. --阳历相关节日  
  14. -- 8 元旦(1月1日)  
  15. -- 16 清明节(4月5日/闰年 4月6日)  
  16. -- 32 劳动节(5月1日)  
  17. -- 64 国庆节(10月1日)  
  18.   
  19. --128 周末  
  20.   
  21. ALTER  FUNCTION   [dbo].[fnCheckDate](@solarDay DATETIME)           
  22.   RETURNS   bigint   AS             
  23.   BEGIN             
  24.       DECLARE   @solData   int             
  25.       DECLARE   @offset   int             
  26.       DECLARE   @iLunar   int             
  27.       DECLARE   @i   INT               
  28.       DECLARE   @j   INT               
  29.       DECLARE   @yDays   int             
  30.       DECLARE   @mDays   int             
  31.       DECLARE   @mLeap   int             
  32.       DECLARE   @mLeapNum   int             
  33.       DECLARE   @bLeap   smallint             
  34.       DECLARE   @temp   int             
  35.               
  36.       DECLARE   @YEAR   INT               
  37.       DECLARE   @MONTH   INT             
  38.       DECLARE   @DAY   INT             
  39.                   
  40.       DECLARE   @OUTPUTDATE   varchar(100)     
  41.   
  42.       DECLARE   @OUTPUTDATA   Bigint   --返回数值  
  43.       SET @OUTPUTDATA = 0   --初始化为非假日  
  44.           
  45.       --保证传进来的日期是不带时间     
  46.                
  47.       SET   @solarDay= convert(datetime,@solarDay,23)       
  48.       SET   @offset=CAST(@solarDay-'1900-01-30' AS INT)         
  49.       print @solarDay  
  50.       print @offset  
  51.       return 0  
  52.               
  53.       --确定农历年开始             
  54.       SET   @i=1900                       
  55.       WHILE   @i<2050   AND   @offset>0             
  56.       BEGIN             
  57.           SET   @yDays=348             
  58.           SET   @mLeapNum=0             
  59.           SELECT   @iLunar=dataInt   FROM   SolarData   WHERE   yearId=@i             
  60.               
  61.           --传回农历年的总天数             
  62.           SET   @j=32768             
  63.           WHILE   @j>8             
  64.           BEGIN             
  65.               IF @iLunar & @j   >0             
  66.                   SET @yDays=@yDays+1             
  67.               SET @j=@j/2             
  68.           END             
  69.               
  70.           --传回农历年闰哪个月   1-12   ,   没闰传回   0             
  71.           SET   @mLeap   = @iLunar & 15             
  72.               
  73.           --传回农历年闰月的天数   ,加在年的总天数上             
  74.           IF   @mLeap > 0             
  75.           BEGIN             
  76.               IF   @iLunar & 65536 > 0             
  77.                   SET   @mLeapNum=30             
  78.               ELSE               
  79.                   SET   @mLeapNum=29             
  80.               
  81.               SET   @yDays=@yDays+@mLeapNum             
  82.           END             
  83.                       
  84.           SET   @offset=@offset-@yDays             
  85.           SET   @i=@i+1             
  86.       END             
  87.                   
  88.       IF   @offset <=0             
  89.       BEGIN             
  90.           SET   @offset=@offset+@yDays             
  91.           SET   @i=@i-1             
  92.       END             
  93.       --确定农历年结束                 
  94.       SET   @YEAR=@i             
  95.           
  96.       --确定农历月开始             
  97.       SET   @i = 1             
  98.       SELECT   @iLunar=dataInt   FROM   SolarData   WHERE   yearId=@YEAR         
  99.           
  100.       --判断那个月是润月             
  101.       SET   @mLeap   =   @iLunar   &   15             
  102.       SET   @bLeap   =   0           
  103.           
  104.       WHILE   @i < 13 AND @offset   >   0             
  105.       BEGIN             
  106.           --判断润月             
  107.           SET   @mDays=0             
  108.           IF   (@mLeap   >   0   AND   @i   =   (@mLeap+1)   AND   @bLeap=0)             
  109.           BEGIN--是润月             
  110.               SET   @i=@i-1             
  111.               SET   @bLeap=1             
  112.               --传回农历年闰月的天数             
  113.               IF   @iLunar   &   65536   >   0             
  114.                   SET   @mDays   =   30             
  115.               ELSE               
  116.                   SET   @mDays   =   29             
  117.           END             
  118.           ELSE             
  119.           --不是润月             
  120.           BEGIN             
  121.               SET   @j=1             
  122.               SET   @temp   =   65536               
  123.               WHILE   @j<=@i             
  124.               BEGIN             
  125.                   SET   @temp=@temp/2             
  126.                   SET   @j=@j+1             
  127.               END             
  128.               
  129.               IF   @iLunar & @temp   >   0             
  130.                   SET @mDays = 30             
  131.               ELSE             
  132.                   SET   @mDays   =   29             
  133.           END             
  134.                   
  135.           --解除闰月         
  136.           IF   @bLeap=1   AND   @i=   (@mLeap+1)         
  137.               SET   @bLeap=0         
  138.           
  139.           SET   @offset=@offset-@mDays             
  140.           SET   @i=@i+1             
  141.       END             
  142.               
  143.       IF   @offset   <=   0             
  144.       BEGIN             
  145.           SET   @offset=@offset+@mDays             
  146.           SET   @i=@i-1             
  147.       END             
  148.           
  149.       --确定农历月结束                 
  150.       SET   @MONTH=@i         
  151.               
  152.       --确定农历日结束                 
  153.       SET   @DAY=@offset    
  154.               
  155.       IF   @bLeap=1          
  156.         SET   @OUTPUTDATE=(CAST(@YEAR   AS   VARCHAR(4))+'-润'+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))     
  157.       ELSE     
  158.         SET   @OUTPUTDATE=(CAST(@YEAR   AS   VARCHAR(4))+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))     
  159.   
  160.   
  161.       DECLARE @tempStart NVARCHAR(20)  
  162.       DECLARE @tempEnd   NVARCHAR(20)  
  163.       IF charindex('-润',@OUTPUTDATE) =0  -- 农历假期判断  
  164.       Begin  
  165.         -- 春节判断  
  166.         DECLARE @preYear int  
  167.          SET @preYear= YEAR(@solarDay)-1  
  168.          IF(@preYear%4=0 AND (@preYear%100<>0 or (@preYear%100=0 and @preYear%400=0)) )   
  169.            set @tempStart= Cast(@preYear AS VARCHAR(4)) +'12'+'29'  
  170.          Else  
  171.            set @tempStart= Cast(@preYear AS VARCHAR(4)) +'12'+'30'  
  172.          set @tempEnd =Cast(YEAR(@solarDay) AS VARCHAR(4)) +'01'+'06'  
  173.         IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) >= @tempStart AND Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) <= @tempEnd)  
  174.            SET @OUTPUTDATA =@OUTPUTDATA | 1  
  175.         --端午节判断  
  176.         set @tempStart= Cast(@preYear AS VARCHAR(4)) +'05'+'05'  
  177.         IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) = Convert(datetime,@tempStart))  
  178.            SET @OUTPUTDATA =@OUTPUTDATA | 2  
  179.         --中秋节  
  180.         set @tempStart= Cast(@preYear AS VARCHAR(4)) +'08'+'15'  
  181.         IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) = Convert(datetime,@tempStart))  
  182.            SET @OUTPUTDATA =@OUTPUTDATA | 4   
  183.       End  
  184.        
  185.          -- 阳历假期判断  
  186.       --元旦  
  187.       DECLARE @CurrentYear int  
  188.       SET @CurrentYear = YEAR(@solarDay)  
  189.       set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'01'+'01'  
  190.          IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))  
  191.             SET @OUTPUTDATA =@OUTPUTDATA | 8  
  192.       --清明节  
  193.          IF(@CurrentYear%4=0 AND (@CurrentYear%100<>0 or (@CurrentYear%100=0 and @CurrentYear%400=0)))   
  194.             set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'04'+'04'   
  195.          ELSE  
  196.             set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'04'+'05'   
  197.          IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))  
  198.             SET @OUTPUTDATA =@OUTPUTDATA | 16  
  199.       --五一  
  200.             set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'05'+'01'   
  201.          IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))  
  202.             SET @OUTPUTDATA =@OUTPUTDATA | 32  
  203.       --十一  
  204.             set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'10'+'01'  
  205.             set @tempEnd =Cast(@CurrentYear AS VARCHAR(4)) +'10'+'03'  
  206.          IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) >= @tempStart AND Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) <= @tempEnd)  
  207.            SET @OUTPUTDATA =@OUTPUTDATA | 64  
  208.   
  209.       -- 周末判断  
  210.            
  211.         IF((DATEPART(Weekday,@solarDay)+@@DATEFIRST-1)%7 =0 OR (DATEPART(Weekday,@solarDay)+@@DATEFIRST-1)%7 =6)  
  212.            SET @OUTPUTDATA =@OUTPUTDATA | 128      
  213.               
  214.       RETURN   @OUTPUTDATA         
  215.   END    
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值