热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLServer公历转农历函数(1900年2049年)

ALTERFUNCTION[dbo].[f_SysGetLunar](@solarDayDATETIME)RETURNSvarchar(200)ASBEGINDECLARE@sol
 ALTER   FUNCTION   [dbo].[f_SysGetLunar](   
   @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   Sysc80   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   Sysc80   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

 

 

--********************************************************

--Sysc80表内容

  select * from Sysc80

yearId databin dataInt
1900 19416 19416
1901 19168 19168
1902 42352 42352
1903 21717 21717
1904 53856 53856
1905 55632 55632
1906 91476 91476
1907 22176 22176
1908 39632 39632
1909 21970 21970
1910 19168 19168
1911 42422 42422
1912 42192 42192
1913 53840 53840
1914 119381 119381
1915 46400 46400
1916 54944 54944
1917 44450 44450
1918 38320 38320
1919 84343 84343
1920 18800 18800
1921 42160 42160
1922 46261 46261
1923 27216 27216
1924 27968 27968
1925 109396 109396
1926 11104 11104
1927 38256 38256
1928 21234 21234
1929 18800 18800
1930 25958 25958
1931 54432 54432
1932 59984 59984
1933 28309 28309
1934 23248 23248
1935 11104 11104
1936 100067 100067
1937 37600 37600
1938 116951 116951
1939 51536 51536
1940 54432 54432
1941 120998 120998
1942 46416 46416
1943 22176 22176
1944 107956 107956
1945 9680 9680
1946 37584 37584
1947 53938 53938
1948 43344 43344
1949 46423 46423
1950 27808 27808
1951 46416 46416
1952 86869 86869
1953 19872 19872
1954 42448 42448
1955 83315 83315
1956 21200 21200
1957 43432 43432
1958 59728 59728
1959 27296 27296
1960 44710 44710
1961 43856 43856
1962 19296 19296
1963 43748 43748
1964 42352 42352
1965 21088 21088
1966 62051 62051
1967 55632 55632
1968 23383 23383
1969 22176 22176
1970 38608 38608
1971 19925 19925
1972 19152 19152
1973 42192 42192
1974 54484 54484
1975 53840 53840
1976 54616 54616
1977 46400 46400
1978 46496 46496
1979 103846 103846
1980 38320 38320
1981 18864 18864
1982 43380 43380
1983 42160 42160
1984 45690 45690
1985 27216 27216
1986 27968 27968
1987 44870 44870
1988 43872 43872
1989 38256 38256
1990 19189 19189
1991 18800 18800
1992 25776 25776
1993 29859 29859
1994 59984 59984
1995 27480 27480
1996 21952 21952
1997 43872 43872
1998 38613 38613
1999 37600 37600
2000 51552 51552
2001 55636 55636
2002 54432 54432
2003 55888 55888
2004 30034 30034
2005 22176 22176
2006 43959 43959
2007 9680 9680
2008 37584 37584
2009 51893 51893
2010 43344 43344
2011 46240 46240
2012 47780 47780
2013 44368 44368
2014 21977 21977
2015 19360 19360
2016 42416 42416
2017 86390 86390
2018 21168 21168
2019 43312 43312
2020 31060 31060
2021 27296 27296
2022 44368 44368
2023 23378 23378
2024 19296 19296
2025 42726 42726
2026 42208 42208
2027 53856 53856
2028 60005 60005
2029 54576 54576
2030 23200 23200
2031 30371 30371
2032 38608 38608
2033 19415 19415
2034 19152 19152
2035 42192 42192
2036 118966 118966
2037 53840 53840
2038 54560 54560
2039 56645 56645
2040 46496 46496
2041 22224 22224
2042 21938 21938
2043 18864 18864
2044 42359 42359
2045 42160 42160
2046 43600 43600
2047 111189 111189
2048 27936 27936
2049 44448 44448

SQLServer公历转农历函数(1900年-2049年)


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
author-avatar
KenNaNa
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有