zoukankan      html  css  js  c++  java
  • 未完成

    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日)

    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=cast(@solarDay AS char(10))          
          SET   @offset=CAST(@solarDay-'1900-01-30' AS INT)      
           
               
          --确定农历年开始          
          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)))  

          IF charindex('-润',@OUTPUTDATE) =0  -- 农历假期判断
          Begin
            DECLARE @tempStart NVARCHAR(20)
            DECLARE @tempEnd   NVARCHAR(20)
            -- 春节判断
            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
            --端午节判断


           
          End


          RETURN   @OUTPUTDATA      
      END     

       

  • 相关阅读:
    【解题报告】NOIP2018
    【解题报告】NOIP2013
    【解题报告】NOIP2014
    【解题报告】NOIP2015
    【解题报告】NOIP2016
    【解题报告】CSPS2020
    【全程NOIP计划】初级数据结构1
    如何通过一个结构体成员变量的地址找到该结构体的首地址?[备忘]
    IGT笔试题,正整数N等于M个不同的正整数之和的问题
    Mac下Perl脚本如何运行
  • 原文地址:https://www.cnblogs.com/xianzuoqiaoqi/p/1510449.html
Copyright © 2011-2022 走看看