SQL农历转换函数(显示中文格式,加入润月的显示)

if object_id(‘fn_getlunar‘) is not null
    drop function fn_getlunar
go
create function dbo.fn_getlunar(@solarday datetime)
returns nvarchar(30)
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 @mleap1 int
  declare @mleapnum int
  declare @bleap smallint
  declare @temp int
  declare @year nvarchar(10)
  declare @month nvarchar(10)
  declare @day nvarchar(10)
  declare @chinesenum nvarchar(10)
  declare @outputdate nvarchar(30)
  set @offset=datediff(day,‘1900-01-30‘,@solarday)
  --确定农历年开始
  set @i=1900
  --set @[email protected]
  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
      set @mleap1= @mleap
      --传回农历年闰月的天数
      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=ltrim(@offset)
  --输出日期
  set @chinesenum=‘0一二三四五六七八九十‘
  while len(@year)>0
  select @outputdate=isnull(@outputdate,‘‘)
         + substring(@chinesenum,left(@year,1)+1,1)
         , @year=stuff(@year,1,1,‘‘)
  set @outputdate=@outputdate+‘年‘
         + case @mleap1 when @month then ‘润‘ else ‘‘ end
  if cast(@month as int)<10
    set @outputdate=@outputdate
         + case @month when 1 then ‘正‘
             else substring(@chinesenum,left(@month,1)+1,1)
           end
  else if cast(@month as int)>=10
    set @outputdate=@outputdate
         + case @month when ‘10‘ then ‘十‘ when 11 then ‘十一‘
           else ‘十二‘ end
  set @outputdate=@outputdate + ‘月‘
  if cast(@day as int)<10
    set @outputdate=@outputdate + ‘初‘
         + substring(@chinesenum,left(@day,1)+1,1)
  else if @day between ‘10‘ and ‘19‘
    set @outputdate=@outputdate
         + case @day when ‘10‘ then ‘初十‘ else ‘十‘+
           substring(@chinesenum,right(@day,1)+1,1) end
  else if @day between ‘20‘ and ‘29‘
    set @outputdate=@outputdate
         + case @day when ‘20‘ then ‘二十‘ else ‘廿‘ end
         + case @day when ‘20‘ then ‘‘ else
           substring(@chinesenum,right(@day,1)+1,1) end
  else
    set @outputdate=@outputdate+‘三十‘
  return @outputdate
end
go
select dbo.fn_getlunar(getdate()) as [改编日期(农历)],getdate() as [改编日期(公历)]
时间: 2024-07-29 22:36:57

SQL农历转换函数(显示中文格式,加入润月的显示)的相关文章

完善SQL农历转换函数

-------------------------------------------------------------------- --  Author : 原著:          改编:htl258(Tony) --  Date   : 2010-04-24 06:39:55 --  Version:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) --          Jul  9 2008 14:43:34 --

C# 怎么显示中文格式的日期、星期几

//该语句显示的为英文格式DateTime.Now.DayOfWeek.ToString(); //显示中文格式星期几 "星期" + DateTime.Now.ToString("ddd",new System.Globalization.CultureInfo("zh-cn")); //显示中文格式的日期DateTime.Now.ToLongDateString(); // 显示格式为"2008年1月1日"DateTime.

flutter showDatePicker显示中文日期_Flutter时间控件显示中文

flutter showDatePicker showTimePicker显示中文日期 1.配置flutter_localizations依赖 找到pubspec.yaml配置flutter_localizations dependencies: flutter: sdk: flutter flutter_localizations: sdk: flutter 2.导入国际化的包 flutter_localizations import 'package:flutter_localization

SQL字符串转换函数

Ascii()函数 返回字符串表达式最左端字符的ASCII码值 语法格式:ascii(字符表达式) 例:ASCII('A'),ASCII('a'),ASCII(0),ASCII(9) 返回 65 97  48  57 Char()函数 将ASCII码转换为字符 语法格式:char(数值表达式) 若输入的不是0-255之间的ASCII码值,则返回一个null值 Lower() upper() 函数 把字符串全部转换为小写/大写 语法格式:lower(字符表达式)   upper (字符表达式) S

SQL中format()函数对应的格式

Microsoft SQL Server 自定义函数整理大全

01.去除字符串中的html标记及标记中的内容 [叶子函数分享一]去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varchar(8000) as begin     declare @i int     while 1 = 1     begin        set @i=len(@maco)        set @maco=replace(@maco

SQL常用自定义函数

去除字符串中连续的分割符 --创建函数 create function [dbo].[m_delrepeatsplit] ( @str varchar(2000), @split nvarchar(200) ) returns nvarchar(2000) as begin --begin declare declare @count int,@i int,@isnull int declare @newchar nvarchar(200),@nn nvarchar(300) set @coun

解决国外模板h1、h2、h3...不显示中文文章标题的问题

如果你经常用国外好看的网页模版时候,会遇到不显示中文文章标题的情况,显示英文标题却正常.遇到这个情况很多人认为应该修改CSS的font-family的字体,其实这是错误的,与CSS无关. 出现这种情况的真正的原因是因为国外主题开发者喜欢使用Cufon字体,所谓Cufon字体是JS的一种特效,它的作用是将文字以图片的形式显现出来.这是为了解决主题设计者想展示的字体,而浏览器却不支持这种字体的矛盾.比如主题设计者想使用Trebuchet MS这种字体,使模板看起来好看又另类,可是浏览器不支持这种字体

SQL 语句转换格式函数Cast、Convert

SQL 语句转换格式函数Cast.Convert CAST和CONVERT都经常被使用.特别提取出来作为一篇文章,方便查找. CAST.CONVERT都可以执行数据类型转换.在大部分情况下,两者执行同样的功能,不同的是CONVERT还提供一些特别的日期格式转换,而CAST没有这个功能. 既然CONVERT包括了CAST的所有功能,而且CONVERT还能进行日期转换,那么为什么需要使用CAST呢?实际上,这是为了ANSI/ISO兼容.CAST是ANSI兼容的,而CONVERT则不是. 语法: CA