文档章节

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

深圳大道
 深圳大道
发布于 2016/12/29 15:38
字数 941
阅读 5
收藏 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
772
19
免费节假日API第一时间更新2019年节假日放假安排 可怜的五一

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

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

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

yangrfa
2018/02/09
403
4
12306的一点小看法

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

谭爷
2014/01/10
1K
16
【广州】3G门户网诚聘web前端工程师,.net开发工程师

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

3G门户网
2011/09/29
806
3

没有更多内容

加载失败,请刷新页面

加载更多

搜索引擎(Elasticsearch搜索详解)

学完本课题,你应达成如下目标: 掌握ES搜索API的规则、用法。 掌握各种查询用法 搜索API 搜索API 端点地址 GET /twitter/_search?q=user:kimchy GET /twitter/tweet,user/_search?q=user:...

这很耳东先生
38分钟前
6
0
浅谈如何减少GC的次数

GC会stop the world。会暂停程序的执行,带来延迟的代价。所以在开发中,我们不希望GC的次数过多。 本文将讨论如何在开发中改善各种细节,从而减少GC的次数。 (1)对象不用时最好显式置为 Nu...

浮躁的码农
40分钟前
1
0
jpa 自定义返回对象

任何ORM框架都少不了开放自定义sql的问题。jpa自然也不例外,很多场景需要写复杂sql的。 首先定义一个方法签名,然后打上@Query注解。像下面这样,需要注意nativeQuery,这个表示query中的字...

朝如青丝暮成雪
今天
3
0
驰骋工作流引擎-批量审批设置

批量审批设置 关键词: 工作流引擎批量审批 Java工作流批量审批设计 应用场景 批量审批最多应用于代办中有很多相同的流程需要审批,若是把一些不是特别重要的审批做批量处理这样就可以提高很...

孟娟
今天
2
0
springmvc源码解析之DispatcherServlet四

说在前面 本次主要介绍DispatcherServlet,关注”天河聊架构“更多精彩。 springmvc配置解析 进入方法org.springframework.web.bind.annotation.support.HandlerMethodInvoker#resolveHttpE...

天河2018
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部