首页 > 数据库 >公历日期转农历日期的SQL函数

公历日期转农历日期的SQL函数

时间:2023-12-08 14:15:03浏览次数:37  
标签:公历 yDays SET -- offset int 日期 SQL DECLARE

 

 

 

/*-------------------------------------------------------------------------------
功能:
     返回指定日期的农历日期
     (需配合 sys_date_lunar 表使用)
参数说明:
     @solarDay   日期
     @type   日期: 0: 年月日
             文本: 1: 月日的文本
             数字: 20: ymd , 21 md
例:
    select dbo.usf_GetDateLunar('2023-12-01',0)        返回:  2023-10-19

    select dbo.usf_GetDateLunar('2023-12-01',1)        返回:  十月十九

    select dbo.usf_GetDateLunar('2023-12-01',20)    返回:  20231019

    select dbo.usf_GetDateLunar('2023-12-01',21)    返回:  1019
-------------------------------------------------------------------------------------*/

create   FUNCTION   [dbo].[usf_GetDateLunar](   
   @solarDay  as DATETIME , @type as tinyint = 0)       
   /* @type 返回格式

   */
 RETURNS   varchar(200)
 AS           
 BEGIN
   --转自CSDN 
     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   sys_date_lunar   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   sys_date_lunar   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)))   

     */
      SET   @OUTPUTDATE=
         case @type
            when 1 then 
                case when @bLeap=1  then '闰' else '' end  
                + case   @MONTH  when 1 then '正月' when 2 then '二月' when 3 then '三月' when 4 then '四月' when 5 then '五月' when 6 then '六月' when 7 then '七月' 
                        when 8 then '八月' when 9 then '九月' when 10 then '十月' when 11 then '十一月' when 12 then '腊月'  else '出错' end
                + case @DAY when 1 then '初一' when 2 then '初二'when 3 then '初三'when 4 then '初四'when 5 then '初五' 
                    when 6 then '初六' when 7 then '初七'when 8 then '初八'when 9 then '初九'when 10 then '初十' 
                    when 11 then '十一' when 12 then '十二'when 13 then '十三'when 14 then '十四'when 15 then '十五' 
                    when 16 then '十六' when 17 then '十七'when 18 then '十八'when 19 then '十九'when 20 then '廿十' 
                    when 21 then '廿一' when 22 then '廿二'when 23 then '廿三'when 24 then '廿四'when 25 then '廿五' 
                    when 26 then '廿六' when 27 then '廿七'when 28 then '廿八'when 29 then '廿九'when 30 then '三十'
                    else '出错' end
            when 20 then CONVERT(varchar(10), @YEAR *10000 + @MONTH*100 +@DAY)
            when 21 then CONVERT(varchar(10),   @MONTH*100 +@DAY)
            else  convert(varchar(10), convert(datetime, (CAST(@YEAR   AS   VARCHAR(4))+'-'+  CAST(@MONTH   AS   VARCHAR(2))+'-' + CAST(@DAY   AS   VARCHAR(2)))  ),120)
         end

     RETURN   @OUTPUTDATE       
 END
GO

 

标签:公历,yDays,SET,--,offset,int,日期,SQL,DECLARE
From: https://www.cnblogs.com/easybi/p/17887018.html

相关文章

  • 数据库数据恢复—无备份,binlog未开启的Mysql数据库误删表数据的数据恢复案例
    mysql数据库数据恢复环境:本地服务器,windowsserver操作系统,部署有mysql单实例,数据库引擎类型为innodb,独立表空间,无数据库备份,未开启binlog。mysql数据库故障:工作人员使用Delete命令删除数据时未添加where子句进行筛选,导致全表数据被删除,删除后未对该表进行任何操作。针对mysql......
  • 从ClickHouse通往MySQL的几条道路
    一、应用背景简介ClickHouse是Yandex(俄罗斯最大的搜索引擎)开源的一个用于实时数据分析的基于列存储的数据库,其处理数据的速度比传统方法快100-1000倍。ClickHouse的性能超过了目前市场上可比的面向列的DBMS,每秒钟每台服务器每秒处理数亿至十亿多行和数十千兆字节的数据。它......
  • Ubuntu安装MySQL数据库
    Ubuntu安装MySQL数据库介绍MySQL的定义MySQL是一种开源关系型数据库管理系统。与其他关系型数据库一样,MySQL将数据存储在由行和列组成的表中。用户可以使用结构化查询语言(通常称为SQL)定义、操作、控制和查询数据。由于MySQL是开源的,因此它的大量功能是在超过25年与用户......
  • SQLBI_精通DAX课程笔记_01_DAX介绍
    一:函数式语言DAX是一个函数式语言,应用于Analysis Services , PowerPivot , 和Power Bi 。二:共同与不同2.1 共同点DAX与PowerPivot for Excel 一起诞生,DAX生来就是Excel系统的一部分,因此,Dax有一部分表达式的语义表达和EXCEL有很多的共同之处,如部分函数的名称和语义......
  • MySQL数据表的CURD
    一、数据表的CURD1.create数据创建一个员工表,新建employee表并向表中添加一些记录:创建数据表:createtableemployee(idint,namevarchar(20),sexint,birthdaydate,salarydouble,entry_datedate,resumetext);向数据表中插入数据:insertintoemployeevalues(......
  • MySQL服务器8核32G max_connections设置为10000的情况,springboot里面的Druid参数配置
    MySQL服务器8核32Gmax_connections设置为10000的情况,springboot里面的Druid参数配置多少合适啊,MySQL服务器8核32G,max_connections设置为10000,确实是相当大的一个配置啊。对于Druid的参数配置,得看你系统的具体情况。一般来说,你可以考虑以下几个参数:initialSize:连接池的初始大小,你......
  • mysql的约束M
    数据表的约束约束的目的是保证数据库中数据的完整性和一致性常见的约束有主键约束(primarykey)外键约束(foreignkey)非空约束(notnull)唯一约束(unique)默认约束(default)1:primarykey约束理解:primarykey可以有一个字段或者多个字段组成,要求:主键字段的数据唯一,并且不能为空......
  • Mysql之多表查询
    关于Mysql的多表操作表与表的关系通常来说我们根据业务要求及其业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以我们将表与表的关系分为三类一对一一对多多对多物理外键和逻辑外键物理外键是值使用foreignkey作为外键关联另一张表的字段的连接方法物理外......
  • pip 安装 mysqlclient报错ERROR: Could not build wheels for mysqlclient, which is
    这是本地环境中没有安装C++的环境,安装好后再次运行报错:国内网站上找了半天,试了又试,不能根本上解决问题,最后从国外的网站上找到的:下载安装MariaDBCConnector,地址:DownloadMariaDBConnectorsfordataaccess&analysis|MariaDB,安装到默认路径下,关闭重新打开cmd,输入:pi......
  • 【转】PLSQL执行SQL脚本文件「适用批量」
    PLSQL:File>New>CommandWindows 创建一个窗口后,输入@符号,然后敲回车。 然后会弹出一个文件选择窗口,选择需要执行的SQL文件即可运行。 扩展批量文件执行假设在这我们需要执行的SQL文件有「参考上图」:CLIENTDB.sql、CLIENTDB2.sql、SMSDB.sql此时我们可以新......