sqlserver中如何计算农历

sqlserver中如何计算农历,第1张

sqlserver中如何计算农历,第2张

1、建立一个表,放初始化数据

因为农历的日期是天文学家算出来的,现在才到2049年,以后有了可以加入!
创建表solar data
(
year id int not null,
data char(7) not null,
dataInt int not null
)

2.插入数据

插入
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 ',56335 44450
联合全部选择1918,' 0x095b0 ',38320联合全部选择1919,' 0x14977 ',84343
联合全部选择1920,' 0x04970 ',18800联合全部选择1921,' 0x0a4b0 ',42160
联合全部选择1922,' 0x0b4b5 ',46261联合全部选择1923,' 0x06a50 ',260 11104
联合全部选择1936,' 0x186e3 ',100067联合全部选择1937,' 0x092e0 ',37600
联合全部选择1938,' 0x1c8d7 ',116951联合全部选择1939,' 0x0c950 ',51536
联合全部选择1940,' 0x0d4a0 ',54432联合全部选择1941,' 0x1d8a6 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 ',2727 19925
联合全部选择1972,' 0x04ad0 ',19152联合全部选择1973,' 0x0a4d0 ',42192
联合全部选择1974,' 0x0d4d4 ',54484联合全部选择1975,' 0x0d250 ',53840
联合全部选择1976,' 0x0d558 ',54616联合全部选择1977,' 0x0b540 ',46400 38256
联合全部选择1990,' 0x04af5 ',19189联合全部选择1991,' 0x04970 ',18800
联合全部选择1992,' 0x064b0 ',25776联合全部选择1993,' 0x074a3 ',29859
联合全部选择1994,' 0x0ea50 ',59984联合全部选择1995,' 0x06b58 ' 9680
联合全部选择2008,' 0x092d0 ',37584联合全部选择2009,' 0x0cab5 ',51893
联合全部选择2010,' 0x0a950 ',43344联合全部选择2011,' 0x0b4a0 ',46240
联合全部选择2012,' 0x0baa4 ',47780联合全部选择2013,' 0x0ad50 ',4368[] 42726
联合全部选择2026,' 0x0a4e0 ',42208联合全部选择2027,' 0x0d260 ',53856
联合全部选择2028,' 0x0ea65 ',60005联合全部选择2029,' 0x0d530 ',54576
联合全部选择2030,' 0x05aa0 ',23200联合全部选择2031,' 0x076a3 ',3030 18864
联合全部选择2044,' 0x0a577 ',42359联合全部选择2045,' 0x0a4b0 ',42160
联合全部选择2046,' 0x0aa50 ',3600联合全部选择2047,' 0x1B255 ',11189
联合全部选择2048,' 0x06D20 ',27936联合全部选择2049,' 0x0da0 ',4448[]

该函数用于读取农历日期。

CREATE函数fn _ get lunar(@ solar day DATETIME)
返回日期时间

AS
BEGIN
DECLARE @ solData INT
DECLARE @ offset INT
DECLARE @ I lunar INT
DECLARE @ I INT
DECLARE @ j INT
DECLARE @ y days INT
DECLARE @ m days INT
DECLARE @ mLeap INT
DECLARE @ mLeapNum INT
DECLARE @ bLeap small INT
DECLARE @ temp INT

DECLARE @ YEAR INT
DECLARE @ MONTH INT
DECLARE @ DAY INT

声明@OUTPUTDATE日期时间

-确保输入日期没有时间
set @ solar day = cast(@ solar day as char(10))
set @ offset = cast(@ solar day-' 1900-01-30 ' as int)


-确定农历新年的开始
set @ I = 1900
-set @ offset = @ soldata
while @ i0
begin
set @ y days = 348[

-如果@ ilunar & @ j > 0
set @ y days = @ y days+1,则返回农历年的总天数
set @ j = 32768
while @ j > 8
begin

-返回农历的闰月1-12,如果没有闰年则返回0
SET @mLeap = @iLunar & 15。

-返回农历闰月的天数,如果@ m leap > 0
begin
if @ I lunar & 65536 > 0
set @ mleapnum = 30
else,则该天数将加到一年的总天数中[

SET @ yDays = @ yDays+@ mLeapNum
END

SET @ offset = @ offset-@ y days
SET @ I = @ I+1
END

if @ offset begin
SET @ offset = @ offset+@ y days
SET @ I = @ I-1
end
-确定农历年的结束
SET @YEAR=@i

-确认农历月份的开始
set @ I = 1
select @ I lunar = data int from solar data where year id = @ year

-判断该月是湿月
set @ m leap = @ I lunar & 15
set @ b leap = 0

而@ I < 13且@ offset > 0
begin
-判断月亮
set @ m days = 0
if(@ m leap > 0且@ i = (@ m leap+1) and @ b leap。]set @ I = @ I-1
set @ b leap = 1
-如果@ ilunar & 65536 > 0
set @ mdays = 30
else,则返回农历闰月的天数。else
-not run yue
begin
set @ j = 1
set @ temp = 65536
while @ j begin
set @ temp = @ temp/2[/]

IF @ iLunar & @ temp > 0
SET @ mDays = 30
ELSE
SET @ mDays = 29
END

-如果@ bleap = 1且@ i = (@ mlap+1)
set @ bleap = 0,则取消闰月

SET @ offset = @ offset-@ mDays
SET @ I = @ I+1
END

IF @ offset BEGIN
SET @ offset = @ offset+@ mDays
SET @ I = @ I-1
END

-确认农历月末
SET @MONTH=@i

-确保阴历日结束
SET @DAY=@offset

SET @ output date = CAST((CAST(@ YEAR AS VARCHAR(4))+'-'+CAST(@ MONTH AS VARCHAR(2))+'-'+CAST(@ DAY AS VARCHAR(2)))AS DATETIME)
RETURN @ output date
END

4.调用方法

选择dbo.fn_GetLunar(getdate())或选择dbo . fn _ get lunar(' 2004年4月13日')

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » sqlserver中如何计算农历

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情