用sql语句实现阳历与农历转换

 1.建一张表 存放数据 在下面SQL函数中有用到

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   

 

 

2创建函数 

CREATE   FUNCTION   [dbo].[fn_GetLunar](  

  @solarDay   DATETIME)          

  RETURNS   varchar(200)      

       

  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)  

       

      --保证传进来的日期是不带时间         

      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          

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

      RETURN   @OUTPUTDATE      

  END 

3.例子

SELECT dbo.fn_GetLunar('1983-1-10') SELECT dbo.fn_GetLunar(GETDATE())

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值