请各位帮忙做一下如何用用sql语句实现阳历与农历转换,我们现有一个人事库里面存的是阳历,能否将它成批替换成农历,谢谢!!!

解决方案 »

  1.   

    找到一个,没测试
    也不知道最早谁写的,没人认就当冒牌写的吧
    CREATE FUNCTION 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   
    GO
      

  2.   

    --调用
    select dbo.fn_GetLunar(getdate())
    --结果
    2006-10-02--不知道对不对
      

  3.   

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