输入阳历取对应阴历的存储过程

--1、建一表,放初始化资料      
  --因为农历的日期,是由天文学家推算出来的,到现在只有到2049年的,以后的有了还可以加入!      
  CREATE     TABLE     SolarData      
  (      
                yearId     int     not     null,      
                data     char(7)     not     null,      
                dataInt     int     not     null      
  )      
     
  --插入数据      
  INSERT     INTO          
  SolarData     SELECT     1900,'0x04bd8',19416     UNION     ALL     SELECT     1901,'0x04ae0',19168      
  UNION     ALL     SELECT     1902,'0x0a570',42352     UNION     ALL     SELECT     1903,'0x054d5',21717      
  UNION     ALL     SELECT     1904,'0x0d260',53856     UNION     ALL     SELECT     1905,'0x0d950',55632      
  UNION     ALL     SELECT     1906,'0x16554',91476     UNION     ALL     SELECT     1907,'0x056a0',22176      
  UNION     ALL     SELECT     1908,'0x09ad0',39632     UNION     ALL     SELECT     1909,'0x055d2',21970      
  UNION     ALL     SELECT     1910,'0x04ae0',19168     UNION     ALL     SELECT     1911,'0x0a5b6',42422      
  UNION     ALL     SELECT     1912,'0x0a4d0',42192     UNION     ALL     SELECT     1913,'0x0d250',53840      
  UNION     ALL     SELECT     1914,'0x1d255',119381     UNION     ALL     SELECT     1915,'0x0b540',46400      
  UNION     ALL     SELECT     1916,'0x0d6a0',54944     UNION     ALL     SELECT     1917,'0x0ada2',44450      
  UNION     ALL     SELECT     1918,'0x095b0',38320     UNION     ALL     SELECT     1919,'0x14977',84343      
  UNION     ALL     SELECT     1920,'0x04970',18800     UNION     ALL     SELECT     1921,'0x0a4b0',42160      
  UNION     ALL     SELECT     1922,'0x0b4b5',46261     UNION     ALL     SELECT     1923,'0x06a50',27216      
  UNION     ALL     SELECT     1924,'0x06d40',27968     UNION     ALL     SELECT     1925,'0x1ab54',109396      
  UNION     ALL     SELECT     1926,'0x02b60',11104     UNION     ALL     SELECT     1927,'0x09570',38256      
  UNION     ALL     SELECT     1928,'0x052f2',21234     UNION     ALL     SELECT     1929,'0x04970',18800      
  UNION     ALL     SELECT     1930,'0x06566',25958     UNION     ALL     SELECT     1931,'0x0d4a0',54432      
  UNION     ALL     SELECT     1932,'0x0ea50',59984     UNION     ALL     SELECT     1933,'0x06e95',28309      
  UNION     ALL     SELECT     1934,'0x05ad0',23248     UNION     ALL     SELECT     1935,'0x02b60',11104      
  UNION     ALL     SELECT     1936,'0x186e3',100067     UNION     ALL     SELECT     1937,'0x092e0',37600      
  UNION     ALL     SELECT     1938,'0x1c8d7',116951     UNION     ALL     SELECT     1939,'0x0c950',51536      
  UNION     ALL     SELECT     1940,'0x0d4a0',54432     UNION     ALL     SELECT     1941,'0x1d8a6',120998      
  UNION     ALL     SELECT     1942,'0x0b550',46416     UNION     ALL     SELECT     1943,'0x056a0',22176      
  UNION     ALL     SELECT     1944,'0x1a5b4',107956     UNION     ALL     SELECT     1945,'0x025d0',9680      
  UNION     ALL     SELECT     1946,'0x092d0',37584     UNION     ALL     SELECT     1947,'0x0d2b2',53938      
  UNION     ALL     SELECT     1948,'0x0a950',43344     UNION     ALL     SELECT     1949,'0x0b557',46423      
  UNION     ALL     SELECT     1950,'0x06ca0',27808     UNION     ALL     SELECT     1951,'0x0b550',46416      
  UNION     ALL     SELECT     1952,'0x15355',86869     UNION     ALL     SELECT     1953,'0x04da0',19872      
  UNION     ALL     SELECT     1954,'0x0a5d0',42448     UNION     ALL     SELECT     1955,'0x14573',83315      
  UNION     ALL     SELECT     1956,'0x052d0',21200     UNION     ALL     SELECT     1957,'0x0a9a8',43432      
  UNION     ALL     SELECT     1958,'0x0e950',59728     UNION     ALL     SELECT     1959,'0x06aa0',27296      
  UNION     ALL     SELECT     1960,'0x0aea6',44710     UNION     ALL     SELECT     1961,'0x0ab50',43856      
  UNION     ALL     SELECT     1962,'0x04b60',19296     UNION     ALL     SELECT     1963,'0x0aae4',43748      
  UNION     ALL     SELECT     1964,'0x0a570',42352     UNION     ALL     SELECT     1965,'0x05260',21088      
  UNION     ALL     SELECT     1966,'0x0f263',62051     UNION     ALL     SELECT     1967,'0x0d950',55632      
  UNION     ALL     SELECT     1968,'0x05b57',23383     UNION     ALL     SELECT     1969,'0x056a0',22176      
  UNION     ALL     SELECT     1970,'0x096d0',38608     UNION     ALL     SELECT     1971,'0x04dd5',19925      
  UNION     ALL     SELECT     1972,'0x04ad0',19152     UNION     ALL     SELECT     1973,'0x0a4d0',42192      
  UNION     ALL     SELECT     1974,'0x0d4d4',54484     UNION     ALL     SELECT     1975,'0x0d250',53840      
  UNION     ALL     SELECT     1976,'0x0d558',54616     UNION     ALL     SELECT     1977,'0x0b540',46400      
  UNION     ALL     SELECT     1978,'0x0b5a0',46496     UNION     ALL     SELECT     1979,'0x195a6',103846      
  UNION     ALL     SELECT     1980,'0x095b0',38320     UNION     ALL     SELECT     1981,'0x049b0',18864      
  UNION     ALL     SELECT     1982,'0x0a974',43380     UNION     ALL     SELECT     1983,'0x0a4b0',42160      
  UNION     ALL     SELECT     1984,'0x0b27a',45690     UNION     ALL     SELECT     1985,'0x06a50',27216      
  UNION     ALL     SELECT     1986,'0x06d40',27968     UNION     ALL     SELECT     1987,'0x0af46',44870      
  UNION     ALL     SELECT     1988,'0x0ab60',43872     UNION     ALL     SELECT     1989,'0x09570',38256      
  UNION     ALL     SELECT     1990,'0x04af5',19189     UNION     ALL     SELECT     1991,'0x04970',18800      
  UNION     ALL     SELECT     1992,'0x064b0',25776     UNION     ALL     SELECT     1993,'0x074a3',29859      
  UNION     ALL     SELECT     1994,'0x0ea50',59984     UNION     ALL     SELECT     1995,'0x06b58',27480      
  UNION     ALL     SELECT     1996,'0x055c0',21952     UNION     ALL     SELECT     1997,'0x0ab60',43872      
  UNION     ALL     SELECT     1998,'0x096d5',38613     UNION     ALL     SELECT     1999,'0x092e0',37600      
  UNION     ALL     SELECT     2000,'0x0c960',51552     UNION     ALL     SELECT     2001,'0x0d954',55636      
  UNION     ALL     SELECT     2002,'0x0d4a0',54432     UNION     ALL     SELECT     2003,'0x0da50',55888      
  UNION     ALL     SELECT     2004,'0x07552',30034     UNION     ALL     SELECT     2005,'0x056a0',22176      
  UNION     ALL     SELECT     2006,'0x0abb7',43959     UNION     ALL     SELECT     2007,'0x025d0',9680      
  UNION     ALL     SELECT     2008,'0x092d0',37584     UNION     ALL     SELECT     2009,'0x0cab5',51893      
  UNION     ALL     SELECT     2010,'0x0a950',43344     UNION     ALL     SELECT     2011,'0x0b4a0',46240      
  UNION     ALL     SELECT     2012,'0x0baa4',47780     UNION     ALL     SELECT     2013,'0x0ad50',44368      
  UNION     ALL     SELECT     2014,'0x055d9',21977     UNION     ALL     SELECT     2015,'0x04ba0',19360      
  UNION     ALL     SELECT     2016,'0x0a5b0',42416     UNION     ALL     SELECT     2017,'0x15176',86390      
  UNION     ALL     SELECT     2018,'0x052b0',21168     UNION     ALL     SELECT     2019,'0x0a930',43312      
  UNION     ALL     SELECT     2020,'0x07954',31060     UNION     ALL     SELECT     2021,'0x06aa0',27296      
  UNION     ALL     SELECT     2022,'0x0ad50',44368     UNION     ALL     SELECT     2023,'0x05b52',23378      
  UNION     ALL     SELECT     2024,'0x04b60',19296     UNION     ALL     SELECT     2025,'0x0a6e6',42726      
  UNION     ALL     SELECT     2026,'0x0a4e0',42208     UNION     ALL     SELECT     2027,'0x0d260',53856      
  UNION     ALL     SELECT     2028,'0x0ea65',60005     UNION     ALL     SELECT     2029,'0x0d530',54576      
  UNION     ALL     SELECT     2030,'0x05aa0',23200     UNION     ALL     SELECT     2031,'0x076a3',30371      
  UNION     ALL     SELECT     2032,'0x096d0',38608     UNION     ALL     SELECT     2033,'0x04bd7',19415      
  UNION     ALL     SELECT     2034,'0x04ad0',19152     UNION     ALL     SELECT     2035,'0x0a4d0',42192      
  UNION     ALL     SELECT     2036,'0x1d0b6',118966     UNION     ALL     SELECT     2037,'0x0d250',53840      
  UNION     ALL     SELECT     2038,'0x0d520',54560     UNION     ALL     SELECT     2039,'0x0dd45',56645      
  UNION     ALL     SELECT     2040,'0x0b5a0',46496     UNION     ALL     SELECT     2041,'0x056d0',22224      
  UNION     ALL     SELECT     2042,'0x055b2',21938     UNION     ALL     SELECT     2043,'0x049b0',18864      
  UNION     ALL     SELECT     2044,'0x0a577',42359     UNION     ALL     SELECT     2045,'0x0a4b0',42160      
  UNION     ALL     SELECT     2046,'0x0aa50',43600     UNION     ALL     SELECT     2047,'0x1b255',111189      
  UNION     ALL     SELECT     2048,'0x06d20',27936     UNION     ALL     SELECT     2049,'0x0ada0',44448      
   

 

 

 

 

 

CREATE     FUNCTION     fn_GetLunar(@solarDay     DATETIME)                      
  RETURNS     datetime              
             
  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     DATETIME                      
             
        --保证传进来的日期是不带时间                      
        SET     @solarDay=cast(@solarDay     AS     char(10))                      
        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)                      
        RETURN     @OUTPUTDATE              
  END                  
     
  ----------------------------------------------------------------------      
  --调用方法      
  select     dbo.fn_GetLunar(getdate())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值