`
shangjava
  • 浏览: 1229571 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SQL农历转换函数

阅读更多

--------------------------------------------------------------------------
-- Author : 原著:不详 改编:htl258(Tony)
-- Subject: 完善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

--创建农历日期函数
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 @offset=@soldata
while @i<2050 and @offset>0
begin
set @ydays=348
set @mleapnum=0
select @ilunar=dataint from solardata whereyearid=@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=N'〇一二三四五六七八九十'
while len(@year)>0
select @outputdate=isnull(@outputdate,'')
+ substring(@chinesenum,left(@year,1)+1,1)
, @year=stuff(@year,1,1,'')
set @outputdate=@outputdate+N'年'
+ case @mleap1 when @month then N'润' else '' end
if cast(@month as int)<10
set @outputdate=@outputdate
+ case @month when 1 then N'正'
else substring(@chinesenum,left(@month,1)+1,1)
end
else if cast(@month as int)>=10
set @outputdate=@outputdate
+ case @month when '10' then N'十' when 11 then N'十一'
else N'十二' end
set @outputdate=@outputdate + N'月'
if cast(@day as int)<10
set @outputdate=@outputdate + N'初'
+ substring(@chinesenum,left(@day,1)+1,1)
else if @day between '10' and '19'
set @outputdate=@outputdate
+ case @day when '10' then N'初十' else N'十'+
substring(@chinesenum,right(@day,1)+1,1) end
else if @day between '20' and '29'
set @outputdate=@outputdate
+ case @day when '20' then N'二十' else N'廿' end
+ case @day when '20' then N'' else
substring(@chinesenum,right(@day,1)+1,1) end
else
set @outputdate=@outputdate+N'三十'
return @outputdate
end
GO

-- 测试

select dbo.fn_GetLunar(getdate()) as [改编日期(农历)], getdate() as [改编日期(公历)]


/*
改编日期(农历) 改编日期(公历)
---------------- -----------------------
二〇一〇年三月十五 2010-04-28 10:44:33.530

(1 行受影响)
*/

select

convert(char(10),dateadd(d,number,'2008-1-1'),23) as 公历,
dbo.fn_GetLunar(dateadd(d,number,'2008-1-1')) as 农历
from master..spt_values
where type='p'
/*
公历 农历
---------- ------------------------------
2008-01-01 二〇〇七年十一月廿三
2008-01-02 二〇〇七年十一月廿四
2008-01-03 二〇〇七年十一月廿五
2008-01-04 二〇〇七年十一月廿六
2008-01-05 二〇〇七年十一月廿七
2008-01-06 二〇〇七年十一月廿八
2008-01-07 二〇〇七年十一月廿九
2008-01-08 二〇〇七年十二月初一
2008-01-09 二〇〇七年十二月初二
2008-01-10 二〇〇七年十二月初三
...............

*/

分享到:
评论

相关推荐

    SQL常用功能自定义函数

    4. **完善SQL农历转换函数**: 农历转换函数是处理日期和时间的一种特殊应用,它能够将公历日期转换为农历日期,这对于处理与中华文化相关的日期信息特别重要。 5. **人民币小写金额转大写**: 这个函数可能是为了...

    收集整理的SQL Server自定义函数

    29.完善SQL农历转换函数 50 30.自定义函数实现位操作 58 31.求某段时间内星期几的天数 61 32.根据进舍位或四舍五入来求值 63 33.字符串转成16进制函数 64 34.去掉字段中多个带区号电话号码前面的区号 65 35.SQL2000/...

    sql创建农历函数sql创建农历函数

    首先创建了包含农历转换规则的表`SolarData`,然后简要探讨了农历转换的基本原理,并提供了一个创建转换函数的框架。实际应用中,还需要根据具体需求进一步完善转换逻辑,确保农历转换的准确性。

    sql日期转换

    `CONVERT`函数是SQL中最常用的日期转换函数之一,它允许你将一个表达式从一种数据类型转换为另一种数据类型。当涉及到日期和时间的转换时,`CONVERT`函数尤其强大,因为它可以按照不同的格式输出日期和时间。 #### ...

    oracle日历转化成农历

    在Oracle中,虽然没有内置的直接转换函数来实现这一功能,但可以通过自定义函数或者利用现有的开源存储过程来实现这一转换。下面我们将详细介绍如何在Oracle中进行阳历到农历的转换。 首先,我们需要理解阳历和农历...

    SqlServer日期转换

    `CONVERT` 是 SQL Server 中一个非常强大的函数,它允许用户将一种数据类型转换为另一种数据类型。当涉及到日期时间格式时,`CONVERT` 尤其有用,它可以将日期时间数据类型转换为字符串,并按照指定的格式输出。 ##...

    SQL常用函数

    本篇文章将详细解析标题“SQL常用函数”中提及的几个重要知识点:汉字首字母拼音、农历日期以及全角字符转换的函数。 首先,我们来看看汉字首字母拼音的处理。在SQL Server中,虽然没有内置函数直接提供这个功能,...

    mysql日历数据表1900-2100(公历表和农历表).rar

    它很可能包含创建和填充日历表的SQL语句,可能包括两个主要的表:一个用于公历(阳历),另一个用于农历(阴历)。这两个表可能包含以下字段: 1. **公历表**: - `id`:唯一标识每一条记录的主键。 - `year`:...

    oracle农历解决方案

    2. 编写转换函数 接下来,我们需要编写一个PL/SQL函数,例如`cn_to_gregorian`,接收农历日期(年、月、日)作为参数,返回对应的阳历日期。这里需要用到农历转换的算法,例如“陈永川算法”或“黄道十二宫算法”,...

    PB( PowerBuilder)阴阳历转换

    - **调用转换函数**:根据用户选择的目标历法调用相应的转换函数。 - **显示结果**:将转换后的日期展示给用户,可以使用标签、文本框或其他UI元素。 3. **效果展示**: 压缩包中的"阴阳历转换.jpg"可能展示了在...

    阳历转农历

    在提供的`阳历转农历.c`文件中,我们可以预期找到实现这些步骤的函数和逻辑。通过阅读和理解代码,我们可以学习到如何在实际项目中处理这种日期转换问题。对于初学者,这是一个很好的实践项目,可以加深对C语言和...

    mysql 老黄历 万年历 农历日期数据 1970-2100

    在处理农历数据时,我们需要编写SQL函数或存储过程来实现农历与公历之间的转换。这可能涉及到复杂的算法,包括农历的闰月规则、节气计算等。例如,可以创建一个名为`convert_lunar_to_gregorian`的函数,将农历日期...

    php阳历转农历优化版_.docx

    - 安全编码:避免SQL注入等安全风险,尤其是在使用这个日期转换结果与其他系统交互时。 6. **优化点**:20210807 FXL 的优化可能包括了更快的计算方法、更准确的农历数据或者提高了代码可读性。具体优化内容需要...

    动态网页中SQL查询语句的使用.pdf

    为了在网页中显示农历日期,通常需要借助额外的JavaScript代码(如`lunarDate.js`),它负责将公历日期转换为农历日期。将此类脚本添加到网页中,并调用其函数,即可实现农历日期的动态显示。 总之,动态网页中的...

    农历日程管理项目.rar

    4. 数据库脚本:可能包括创建日程表的SQL语句,以及用于处理农历日期转换的函数或存储过程。 5. 其他资源文件:可能包含图片、图标或其他辅助文件,用于增强日程管理系统的视觉效果。 总的来说,这个农历日程管理...

    基于PHP的农历查询系统源码.zip

    这个系统的核心功能是将公历日期转换为对应的农历日期,并可能提供相关的节日和节气信息。源码的提供允许开发者深入理解其工作原理,进行二次开发或学习PHP编程。 【描述】: 这个源码包包含了一个完整的农历查询...

    PHP实例开发源码-小蜜蜂PHP农历查询系统.zip

    2. **农历计算算法**:农历查询系统的核心在于农历转换算法,它需要将公历日期转换为农历日期。这通常涉及到复杂的数学计算,包括闰年、节气等的处理。开发者可能使用了预先存在的库或者自定义算法来实现这一功能。 ...

    易语言540个易模块

    详细的公农历转换1.0 详细的公农历转换1.2 逍遥带符号液晶 新编码转换大全 新注册系统热键1.0 信息提示框控件(Tip) 星光灭绝1.0 形象大使1.0 修改菜单1.0版 寻找磁盘文件 寻找注册表 循环冗余校验 Y 压缩...

    vc实现 桌面助手 农历 备忘

    1. **农历功能**:在Windows应用程序中实现农历显示,通常需要处理中国农历与公历之间的转换算法。开发者可能使用了特定的库或者自行编写了代码来计算和显示农历日期,这涉及到日期和时间的处理,以及对不同日历系统...

Global site tag (gtag.js) - Google Analytics