文档章节

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

深圳大道
 深圳大道
发布于 2016/12/29 15:33
字数 941
阅读 39
收藏 0
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- 日期检测函数,返回相关节假日
-- 0 非假日
-- 农历相关假日
-- 1 春节(正月初一 至 正月初七)
-- 2 端午节(五月五日)
-- 4 中秋节(八月十五)

--阳历相关节日
-- 8 元旦(1月1日)
-- 16 清明节(4月5日/闰年 4月6日)
-- 32 劳动节(5月1日)
-- 64 国庆节(10月1日)

--128 周末

ALTER  FUNCTION   [dbo].[fnCheckDate](@solarDay DATETIME)         
  RETURNS   bigint   AS           
  BEGIN           
      DECLARE   @solData   int           
      DECLARE   @offset   int           
      DECLARE   @iLunar   int           
      DECLARE   @i   INT             
      DECLARE   @j   INT             
      DECLARE   @yDays   int           
      DECLARE   @mDays   int           
      DECLARE   @mLeap   int           
      DECLARE   @mLeapNum   int           
      DECLARE   @bLeap   smallint           
      DECLARE   @temp   int           
            
      DECLARE   @YEAR   INT             
      DECLARE   @MONTH   INT           
      DECLARE   @DAY   INT           
                
      DECLARE   @OUTPUTDATE   varchar(100)   

      DECLARE   @OUTPUTDATA   Bigint   --返回数值
      SET @OUTPUTDATA = 0   --初始化为非假日
        
      --保证传进来的日期是不带时间   
             
      SET   @solarDay= convert(datetime,@solarDay,23)     
      SET   @offset=CAST(@solarDay-'1900-01-30' AS INT)       
      print @solarDay
      print @offset
      return 0
            
      --确定农历年开始           
      SET   @i=1900                     
      WHILE   @i<2050   AND   @offset>0           
      BEGIN           
          SET   @yDays=348           
          SET   @mLeapNum=0           
          SELECT   @iLunar=dataInt   FROM   SolarData   WHERE   yearId=@i           
            
          --传回农历年的总天数           
          SET   @j=32768           
          WHILE   @j>8           
          BEGIN           
              IF @iLunar & @j   >0           
                  SET @yDays=@yDays+1           
              SET @j=@j/2           
          END           
            
          --传回农历年闰哪个月   1-12   ,   没闰传回   0           
          SET   @mLeap   = @iLunar & 15           
            
          --传回农历年闰月的天数   ,加在年的总天数上           
          IF   @mLeap > 0           
          BEGIN           
              IF   @iLunar & 65536 > 0           
                  SET   @mLeapNum=30           
              ELSE             
                  SET   @mLeapNum=29           
            
              SET   @yDays=@yDays+@mLeapNum           
          END           
                    
          SET   @offset=@offset-@yDays           
          SET   @i=@i+1           
      END           
                
      IF   @offset <=0           
      BEGIN           
          SET   @offset=@offset+@yDays           
          SET   @i=@i-1           
      END           
      --确定农历年结束               
      SET   @YEAR=@i           
        
      --确定农历月开始           
      SET   @i = 1           
      SELECT   @iLunar=dataInt   FROM   SolarData   WHERE   yearId=@YEAR       
        
      --判断那个月是润月           
      SET   @mLeap   =   @iLunar   &   15           
      SET   @bLeap   =   0         
        
      WHILE   @i < 13 AND @offset   >   0           
      BEGIN           
          --判断润月           
          SET   @mDays=0           
          IF   (@mLeap   >   0   AND   @i   =   (@mLeap+1)   AND   @bLeap=0)           
          BEGIN--是润月           
              SET   @i=@i-1           
              SET   @bLeap=1           
              --传回农历年闰月的天数           
              IF   @iLunar   &   65536   >   0           
                  SET   @mDays   =   30           
              ELSE             
                  SET   @mDays   =   29           
          END           
          ELSE           
          --不是润月           
          BEGIN           
              SET   @j=1           
              SET   @temp   =   65536             
              WHILE   @j<=@i           
              BEGIN           
                  SET   @temp=@temp/2           
                  SET   @j=@j+1           
              END           
            
              IF   @iLunar & @temp   >   0           
                  SET @mDays = 30           
              ELSE           
                  SET   @mDays   =   29           
          END           
                
          --解除闰月       
          IF   @bLeap=1   AND   @i=   (@mLeap+1)       
              SET   @bLeap=0       
        
          SET   @offset=@offset-@mDays           
          SET   @i=@i+1           
      END           
            
      IF   @offset   <=   0           
      BEGIN           
          SET   @offset=@offset+@mDays           
          SET   @i=@i-1           
      END           
        
      --确定农历月结束               
      SET   @MONTH=@i       
            
      --确定农历日结束               
      SET   @DAY=@offset  
            
      IF   @bLeap=1        
        SET   @OUTPUTDATE=(CAST(@YEAR   AS   VARCHAR(4))+'-润'+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))   
      ELSE   
        SET   @OUTPUTDATE=(CAST(@YEAR   AS   VARCHAR(4))+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))   


      DECLARE @tempStart NVARCHAR(20)
      DECLARE @tempEnd   NVARCHAR(20)
      IF charindex('-润',@OUTPUTDATE) =0  -- 农历假期判断
      Begin
        -- 春节判断
        DECLARE @preYear int
         SET @preYear= YEAR(@solarDay)-1
         IF(@preYear%4=0 AND (@preYear%100<>0 or (@preYear%100=0 and @preYear%400=0)) ) 
           set @tempStart= Cast(@preYear AS VARCHAR(4)) +'12'+'29'
         Else
           set @tempStart= Cast(@preYear AS VARCHAR(4)) +'12'+'30'
         set @tempEnd =Cast(YEAR(@solarDay) AS VARCHAR(4)) +'01'+'06'
        IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) >= @tempStart AND Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) <= @tempEnd)
           SET @OUTPUTDATA =@OUTPUTDATA | 1
        --端午节判断
        set @tempStart= Cast(@preYear AS VARCHAR(4)) +'05'+'05'
        IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) = Convert(datetime,@tempStart))
           SET @OUTPUTDATA =@OUTPUTDATA | 2
        --中秋节
        set @tempStart= Cast(@preYear AS VARCHAR(4)) +'08'+'15'
        IF(Convert(datetime,CONVERT(varchar(100), @OUTPUTDATE, 23)) = Convert(datetime,@tempStart))
           SET @OUTPUTDATA =@OUTPUTDATA | 4 
      End
     
         -- 阳历假期判断
      --元旦
      DECLARE @CurrentYear int
      SET @CurrentYear = YEAR(@solarDay)
      set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'01'+'01'
         IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))
            SET @OUTPUTDATA =@OUTPUTDATA | 8
      --清明节
         IF(@CurrentYear%4=0 AND (@CurrentYear%100<>0 or (@CurrentYear%100=0 and @CurrentYear%400=0))) 
            set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'04'+'04' 
         ELSE
            set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'04'+'05' 
         IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))
            SET @OUTPUTDATA =@OUTPUTDATA | 16
      --五一
            set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'05'+'01' 
         IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) = Convert(datetime,@tempStart))
            SET @OUTPUTDATA =@OUTPUTDATA | 32
      --十一
            set @tempStart= Cast(@CurrentYear AS VARCHAR(4)) +'10'+'01'
            set @tempEnd =Cast(@CurrentYear AS VARCHAR(4)) +'10'+'03'
         IF(Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) >= @tempStart AND Convert(datetime,CONVERT(varchar(100), @solarDay, 23)) <= @tempEnd)
           SET @OUTPUTDATA =@OUTPUTDATA | 64

      -- 周末判断
         
        IF((DATEPART(Weekday,@solarDay)+@@DATEFIRST-1)%7 =0 OR (DATEPART(Weekday,@solarDay)+@@DATEFIRST-1)%7 =6)
           SET @OUTPUTDATA =@OUTPUTDATA | 128    
            
      RETURN   @OUTPUTDATA       
  END

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/8166225

深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
2011年节假日安排通知 年底最值得期待的消息!

元旦:1月1、2、3日放假三天。 春节:2月2、3、4、5、6、7、8日放假七天。 清明:4月4、5、6日放假三天。 五一:4月29、30、5月1日放假三天。 端午节:6月16日法定节假日,共1天 中秋:9月1...

红薯
2010/12/09
799
19
免费节假日API第一时间更新2019年节假日放假安排 可怜的五一

国务院办公厅关于2019年部分节假日安排的通知 各省、自治区、直辖市人民政府,国务院各部委、各直属机构: 经国务院批准,现将2019年元旦、春节、清明节、劳动节、端午节、中秋节和国庆节放假...

xiaogg
2018/12/06
560
0
定时任务如何做到互斥

如题,比如定义了以下几个定时任务: 1. 每天早上8点执行动作A; 2. 节假日(五一、十一、中秋等)的早上8点不执行动作A,有可能执行动作B,也有可能什么都不执行; 3. 周末早上8点执行动作C。...

yangrfa
2018/02/09
647
4
【广州】3G门户网诚聘web前端工程师,.net开发工程师

(JavaScript方向)Web前端工程师 岗位职责: 1、负责Go系列类客户端产品前端开发; 2、负责全网炫版版面制作(JavaScript方向); 3、基于移动互联网浏览器的技术研究。 任职要求: 1、有前...

3G门户网
2011/09/29
811
3
12306的一点小看法

年关将至,很多朋友都让帮忙买票,插件大行其道。12306真的是苦不堪言,一下动态的验证码,被网友骂,一下子又改回来了。基本上是一到开放时间,必卡。 为什么淘宝碰到双11没有挂,一方面淘宝...

谭爷
2014/01/10
1K
16

没有更多内容

加载失败,请刷新页面

加载更多

Spring Cloud Sleuth 整合 feign 源码分析之修改span名称

org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClient 包括创建span一些参数 需求场景: 由于项目中有restful 风格的http请求,sleuth feign 的span名称默认是u...

xiaomin0322
24分钟前
4
0
Less 延伸

extend 是一个 Less 伪类,它通过使用 :extend 选择器在一个选择器中扩展其他选择器样式。 扩展语法 扩展可以是附加到选择器,也可以是集中放置在规则,看上去像是带有选择器参数的可选伪类,...

凌兮洛
24分钟前
4
0
RedHat 7.0系统中安装mysql 5.7.22

在安装之前,首先要查看的是,你的系统中有没有已经安装过的情况。键入rpm -qa|grep mysql,如果无任何显示,则表示没有安装过相关组件,如果有,则根据显示出来的名字,键入rpm -e --nodeps...

最菜最菜之小菜鸟
30分钟前
4
0
RPA:企业信息孤岛的“克星”

为了降本增效,近来世界范围内掀起一股流程优化的热潮,转型升级成为众多企业时刻挂在嘴边的热词。不过在企业数字化转型的过程中,信息孤岛的出现,往往成为了企业升级的绊脚石。 信息孤岛:...

UiBot
30分钟前
4
0
我的测试

我的测试

daiison
30分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部