sql陽曆轉陰曆

USE [rossic]
GO
/****** Object:  StoredProcedure [dbo].[fn_GetLunar]    Script Date: 02/23/2010 15:46:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
     
CREATE     proc   [dbo].[fn_GetLunar]          
 -- RETURNS   datetime   
  @solarDay   DATETIME ,  
  @OUTPUTDATE   DATETIME  output   
  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   @solarDay datetime        
               
     
       
      --保證傳進來的日期是不帶時間          
      SET   @solarDay = CONVERT(varchar(10),@solarDay,120)
-- getdate()         
      SET   @offset=CAST((@solarDay-'1900-01-30')   AS   INT)      
       
           
      --確定農曆年開始          
      SET   @i=1900          
      --SET   @offset=@solData          
      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          
           
      SET   @OUTPUTDATE=CAST((CAST(@YEAR   AS   VARCHAR(4))+'-'+CAST(@MONTH   AS   VARCHAR(2))+'-'+CAST(@DAY   AS   VARCHAR(2)))   AS   DATETIME)          
   
  END        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章