生日提醒之农历,公历问题

1.创建基础数据--1900至2049年公历,农历比照表

代码
 
   
1 CREATE TABLE SolarData
2 (
3 yearId int not null ,
4 data char ( 7 ) not null ,
5 dataInt int not null
6 )
7   GO
8   -- 插入数据
9   INSERT INTO
10 SolarData SELECT 1900 , ' 0x04bd8 ' , 19416 UNION ALL SELECT 1901 , ' 0x04ae0 ' , 19168
11   UNION ALL SELECT 1902 , ' 0x0a570 ' , 42352 UNION ALL SELECT 1903 , ' 0x054d5 ' , 21717
12   UNION ALL SELECT 1904 , ' 0x0d260 ' , 53856 UNION ALL SELECT 1905 , ' 0x0d950 ' , 55632
13 UNION ALL SELECT 1906 , ' 0x16554 ' , 91476 UNION ALL SELECT 1907 , ' 0x056a0 ' , 22176
14 UNION ALL SELECT 1908 , ' 0x09ad0 ' , 39632 UNION ALL SELECT 1909 , ' 0x055d2 ' , 21970
15 UNION ALL SELECT 1910 , ' 0x04ae0 ' , 19168 UNION ALL SELECT 1911 , ' 0x0a5b6 ' , 42422
16 UNION ALL SELECT 1912 , ' 0x0a4d0 ' , 42192 UNION ALL SELECT 1913 , ' 0x0d250 ' , 53840
17 UNION ALL SELECT 1914 , ' 0x1d255 ' , 119381 UNION ALL SELECT 1915 , ' 0x0b540 ' , 46400
18 UNION ALL SELECT 1916 , ' 0x0d6a0 ' , 54944 UNION ALL SELECT 1917 , ' 0x0ada2 ' , 44450
19 UNION ALL SELECT 1918 , ' 0x095b0 ' , 38320 UNION ALL SELECT 1919 , ' 0x14977 ' , 84343
20 UNION ALL SELECT 1920 , ' 0x04970 ' , 18800 UNION ALL SELECT 1921 , ' 0x0a4b0 ' , 42160
21 UNION ALL SELECT 1922 , ' 0x0b4b5 ' , 46261 UNION ALL SELECT 1923 , ' 0x06a50 ' , 27216
22 UNION ALL SELECT 1924 , ' 0x06d40 ' , 27968 UNION ALL SELECT 1925 , ' 0x1ab54 ' , 109396
23 UNION ALL SELECT 1926 , ' 0x02b60 ' , 11104 UNION ALL SELECT 1927 , ' 0x09570 ' , 38256
24 UNION ALL SELECT 1928 , ' 0x052f2 ' , 21234 UNION ALL SELECT 1929 , ' 0x04970 ' , 18800
25 UNION ALL SELECT 1930 , ' 0x06566 ' , 25958 UNION ALL SELECT 1931 , ' 0x0d4a0 ' , 54432
26 UNION ALL SELECT 1932 , ' 0x0ea50 ' , 59984 UNION ALL SELECT 1933 , ' 0x06e95 ' , 28309
27 UNION ALL SELECT 1934 , ' 0x05ad0 ' , 23248 UNION ALL SELECT 1935 , ' 0x02b60 ' , 11104
28 UNION ALL SELECT 1936 , ' 0x186e3 ' , 100067 UNION ALL SELECT 1937 , ' 0x092e0 ' , 37600
29 UNION ALL SELECT 1938 , ' 0x1c8d7 ' , 116951 UNION ALL SELECT 1939 , ' 0x0c950 ' , 51536
30 UNION ALL SELECT 1940 , ' 0x0d4a0 ' , 54432 UNION ALL SELECT 1941 , ' 0x1d8a6 ' , 120998
31 UNION ALL SELECT 1942 , ' 0x0b550 ' , 46416 UNION ALL SELECT 1943 , ' 0x056a0 ' , 22176
32 UNION ALL SELECT 1944 , ' 0x1a5b4 ' , 107956 UNION ALL SELECT 1945 , ' 0x025d0 ' , 9680
33 UNION ALL SELECT 1946 , ' 0x092d0 ' , 37584 UNION ALL SELECT 1947 , ' 0x0d2b2 ' , 53938
34 UNION ALL SELECT 1948 , ' 0x0a950 ' , 43344 UNION ALL SELECT 1949 , ' 0x0b557 ' , 46423
35 UNION ALL SELECT 1950 , ' 0x06ca0 ' , 27808 UNION ALL SELECT 1951 , ' 0x0b550 ' , 46416
36 UNION ALL SELECT 1952 , ' 0x15355 ' , 86869 UNION ALL SELECT 1953 , ' 0x04da0 ' , 19872
37 UNION ALL SELECT 1954 , ' 0x0a5d0 ' , 42448 UNION ALL SELECT 1955 , ' 0x14573 ' , 83315
38 UNION ALL SELECT 1956 , ' 0x052d0 ' , 21200 UNION ALL SELECT 1957 , ' 0x0a9a8 ' , 43432
39 UNION ALL SELECT 1958 , ' 0x0e950 ' , 59728 UNION ALL SELECT 1959 , ' 0x06aa0 ' , 27296
40 UNION ALL SELECT 1960 , ' 0x0aea6 ' , 44710 UNION ALL SELECT 1961 , ' 0x0ab50 ' , 43856
41 UNION ALL SELECT 1962 , ' 0x04b60 ' , 19296 UNION ALL SELECT 1963 , ' 0x0aae4 ' , 43748
42 UNION ALL SELECT 1964 , ' 0x0a570 ' , 42352 UNION ALL SELECT 1965 , ' 0x05260 ' , 21088
43 UNION ALL SELECT 1966 , ' 0x0f263 ' , 62051 UNION ALL SELECT 1967 , ' 0x0d950 ' , 55632
44 UNION ALL SELECT 1968 , ' 0x05b57 ' , 23383 UNION ALL SELECT 1969 , ' 0x056a0 ' , 22176
45 UNION ALL SELECT 1970 , ' 0x096d0 ' , 38608 UNION ALL SELECT 1971 , ' 0x04dd5 ' , 19925
46 UNION ALL SELECT 1972 , ' 0x04ad0 ' , 19152 UNION ALL SELECT 1973 , ' 0x0a4d0 ' , 42192
47 UNION ALL SELECT 1974 , ' 0x0d4d4 ' , 54484 UNION ALL SELECT 1975 , ' 0x0d250 ' , 53840
48 UNION ALL SELECT 1976 , ' 0x0d558 ' , 54616 UNION ALL SELECT 1977 , ' 0x0b540 ' , 46400
49 UNION ALL SELECT 1978 , ' 0x0b5a0 ' , 46496 UNION ALL SELECT 1979 , ' 0x195a6 ' , 103846
50 UNION ALL SELECT 1980 , ' 0x095b0 ' , 38320 UNION ALL SELECT 1981 , ' 0x049b0 ' , 18864
51 UNION ALL SELECT 1982 , ' 0x0a974 ' , 43380 UNION ALL SELECT 1983 , ' 0x0a4b0 ' , 42160
52 UNION ALL SELECT 1984 , ' 0x0b27a ' , 45690 UNION ALL SELECT 1985 , ' 0x06a50 ' , 27216
53 UNION ALL SELECT 1986 , ' 0x06d40 ' , 27968 UNION ALL SELECT 1987 , ' 0x0af46 ' , 44870
54 UNION ALL SELECT 1988 , ' 0x0ab60 ' , 43872 UNION ALL SELECT 1989 , ' 0x09570 ' , 38256
55 UNION ALL SELECT 1990 , ' 0x04af5 ' , 19189 UNION ALL SELECT 1991 , ' 0x04970 ' , 18800
56 UNION ALL SELECT 1992 , ' 0x064b0 ' , 25776 UNION ALL SELECT 1993 , ' 0x074a3 ' , 29859
57 UNION ALL SELECT 1994 , ' 0x0ea50 ' , 59984 UNION ALL SELECT 1995 , ' 0x06b58 ' , 27480
58 UNION ALL SELECT 1996 , ' 0x055c0 ' , 21952 UNION ALL SELECT 1997 , ' 0x0ab60 ' , 43872
59 UNION ALL SELECT 1998 , ' 0x096d5 ' , 38613 UNION ALL SELECT 1999 , ' 0x092e0 ' , 37600
60 UNION ALL SELECT 2000 , ' 0x0c960 ' , 51552 UNION ALL SELECT 2001 , ' 0x0d954 ' , 55636
61 UNION ALL SELECT 2002 , ' 0x0d4a0 ' , 54432 UNION ALL SELECT 2003 , ' 0x0da50 ' , 55888
62 UNION ALL SELECT 2004 , ' 0x07552 ' , 30034 UNION ALL SELECT 2005 , ' 0x056a0 ' , 22176
63 UNION ALL SELECT 2006 , ' 0x0abb7 ' , 43959 UNION ALL SELECT 2007 , ' 0x025d0 ' , 9680
64 UNION ALL SELECT 2008 , ' 0x092d0 ' , 37584 UNION ALL SELECT 2009 , ' 0x0cab5 ' , 51893
65 UNION ALL SELECT 2010 , ' 0x0a950 ' , 43344 UNION ALL SELECT 2011 , ' 0x0b4a0 ' , 46240
66 UNION ALL SELECT 2012 , ' 0x0baa4 ' , 47780 UNION ALL SELECT 2013 , ' 0x0ad50 ' , 44368
67 UNION ALL SELECT 2014 , ' 0x055d9 ' , 21977 UNION ALL SELECT 2015 , ' 0x04ba0 ' , 19360
68 UNION ALL SELECT 2016 , ' 0x0a5b0 ' , 42416 UNION ALL SELECT 2017 , ' 0x15176 ' , 86390
69 UNION ALL SELECT 2018 , ' 0x052b0 ' , 21168 UNION ALL SELECT 2019 , ' 0x0a930 ' , 43312
70 UNION ALL SELECT 2020 , ' 0x07954 ' , 31060 UNION ALL SELECT 2021 , ' 0x06aa0 ' , 27296
71 UNION ALL SELECT 2022 , ' 0x0ad50 ' , 44368 UNION ALL SELECT 2023 , ' 0x05b52 ' , 23378
72 UNION ALL SELECT 2024 , ' 0x04b60 ' , 19296 UNION ALL SELECT 2025 , ' 0x0a6e6 ' , 42726
73 UNION ALL SELECT 2026 , ' 0x0a4e0 ' , 42208 UNION ALL SELECT 2027 , ' 0x0d260 ' , 53856
74 UNION ALL SELECT 2028 , ' 0x0ea65 ' , 60005 UNION ALL SELECT 2029 , ' 0x0d530 ' , 54576
75 UNION ALL SELECT 2030 , ' 0x05aa0 ' , 23200 UNION ALL SELECT 2031 , ' 0x076a3 ' , 30371
76 UNION ALL SELECT 2032 , ' 0x096d0 ' , 38608 UNION ALL SELECT 2033 , ' 0x04bd7 ' , 19415
77 UNION ALL SELECT 2034 , ' 0x04ad0 ' , 19152 UNION ALL SELECT 2035 , ' 0x0a4d0 ' , 42192
78 UNION ALL SELECT 2036 , ' 0x1d0b6 ' , 118966 UNION ALL SELECT 2037 , ' 0x0d250 ' , 53840
79 UNION ALL SELECT 2038 , ' 0x0d520 ' , 54560 UNION ALL SELECT 2039 , ' 0x0dd45 ' , 56645
80 UNION ALL SELECT 2040 , ' 0x0b5a0 ' , 46496 UNION ALL SELECT 2041 , ' 0x056d0 ' , 22224
81 UNION ALL SELECT 2042 , ' 0x055b2 ' , 21938 UNION ALL SELECT 2043 , ' 0x049b0 ' , 18864
82 UNION ALL SELECT 2044 , ' 0x0a577 ' , 42359 UNION ALL SELECT 2045 , ' 0x0a4b0 ' , 42160
83 UNION ALL SELECT 2046 , ' 0x0aa50 ' , 43600 UNION ALL SELECT 2047 , ' 0x1b255 ' , 111189
84 UNION ALL SELECT 2048 , ' 0x06d20 ' , 27936 UNION ALL SELECT 2049 , ' 0x0ada0 ' , 44448

--这个不知道怎么比照的,也没研究过。来源于网络:http://topic.csdn.net/u/20100424/07/29529D9D-BC54-4877-B198-4426B4D85024.html

2.获取农历的方法

公历获取农历
 
   
1 CREATE FUNCTION fn_GetLunar( @solarDay DATETIME )
2 RETURNS VARCHAR ( 10 )
3 AS
4 BEGIN
5 DECLARE @solData int
6 DECLARE @offset int
7 DECLARE @iLunar int
8 DECLARE @i INT
9 DECLARE @j INT
10 DECLARE @yDays int
11 DECLARE @mDays int
12 DECLARE @mLeap int
13 DECLARE @mLeapNum int
14 DECLARE @bLeap smallint
15 DECLARE @temp int
16
17 DECLARE @YEAR INT
18 DECLARE @MONTH INT
19 DECLARE @DAY INT
20
21 DECLARE @OUTPUTDATE VARCHAR ( 10 )
22
23 -- 保证传进来的日期是不带时间
24 SET @solarDay = CONVERT ( NVARCHAR ( 10 ), @solarDay , 120 ) -- cast(@solarDay AS char(10))
25 SET @offset = CAST ( @solarDay - ' 1900-01-30 ' AS INT )
26
27
28 -- 确定农历年开始
29 SET @i = 1900
30 -- SET @offset=@solData
31 WHILE @i < 2050 AND @offset > 0
32 BEGIN
33 SET @yDays = 348
34 SET @mLeapNum = 0
35 SELECT @iLunar = dataInt FROM SolarData WHERE yearId = @i
36
37 -- 传回农历年的总天数
38 SET @j = 32768
39 WHILE @j > 8
40 BEGIN
41 IF @iLunar & @j > 0
42 SET @yDays = @yDays + 1
43 SET @j = @j / 2
44 END
45
46 -- 传回农历年闰哪个月 1-12 , 没闰传回 0
47 SET @mLeap = @iLunar & 15
48
49 -- 传回农历年闰月的天数 ,加在年的总天数上
50 IF @mLeap > 0
51 BEGIN
52 IF @iLunar & 65536 > 0
53 SET @mLeapNum = 30
54 ELSE
55 SET @mLeapNum = 29
56
57 SET @yDays = @yDays + @mLeapNum
58 END
59
60 SET @offset = @offset - @yDays
61 SET @i = @i + 1
62 END
63
64 IF @offset <= 0
65 BEGIN
66 SET @offset = @offset + @yDays
67 SET @i = @i - 1
68 END
69 -- 确定农历年结束
70 SET @YEAR = @i
71
72 -- 确定农历月开始
73 SET @i = 1
74 SELECT @iLunar = dataInt FROM SolarData WHERE yearId = @YEAR
75
76 -- 判断那个月是润月
77 SET @mLeap = @iLunar & 15
78 SET @bLeap = 0
79
80 WHILE @i < 13 AND @offset > 0
81 BEGIN
82 -- 判断润月
83 SET @mDays = 0
84 IF ( @mLeap > 0 AND @i = ( @mLeap + 1 ) AND @bLeap = 0 )
85 BEGIN -- 是润月
86 SET @i = @i - 1
87 SET @bLeap = 1
88 -- 传回农历年闰月的天数
89 IF @iLunar & 65536 > 0
90 SET @mDays = 30
91 ELSE
92 SET @mDays = 29
93 END
94 ELSE
95 -- 不是润月
96 BEGIN
97 SET @j = 1
98 SET @temp = 65536
99 WHILE @j <= @i
100 BEGIN
101 SET @temp = @temp / 2
102 SET @j = @j + 1
103 END
104
105 IF @iLunar & @temp > 0
106 SET @mDays = 30
107 ELSE
108 SET @mDays = 29
109 END
110
111 -- 解除闰月
112 IF @bLeap = 1 AND @i = ( @mLeap + 1 )
113 SET @bLeap = 0
114
115 SET @offset = @offset - @mDays
116 SET @i = @i + 1
117 END
118
119 IF @offset <= 0
120 BEGIN
121 SET @offset = @offset + @mDays
122 SET @i = @i - 1
123 END
124
125 -- 确定农历月结束
126 SET @MONTH = @i
127
128 -- 确定农历日结束
129 SET @DAY = @offset
130
131 SET @OUTPUTDATE = CAST ( @YEAR AS VARCHAR ( 4 )) + ' - ' +RIGHT ( ' 0 ' + CAST ( @MONTH AS VARCHAR ( 2 )), 2 ) + ' - ' +RIGHT ( ' 0 ' + CAST ( @DAY AS VARCHAR ( 2 )), 2 ) -- CAST((CAST(@YEAR AS VARCHAR(4))+'-'+CAST(@MONTH AS VARCHAR(2))+'-'+CAST(@DAY AS VARCHAR(2))) AS DATETIME)
132 RETURN @OUTPUTDATE
133 END
134
135 -- 调用方法
136 -- DECLARE @d DATETIME;
137 -- SET @d=GETDATE();
138 -- SELECT dbo.fn_GetLunar(@d)
139 GO
140

--来源于网络:http://topic.csdn.net/u/20100424/07/29529D9D-BC54-4877-B198-4426B4D85024.html

--并改进了有问题部分

3.创建公历,农历详细比照表

公历农历详细比照表
 
   
1 CREATE TABLE [ dbo ] . [ SolarLunarData ] (
2 [ RecID ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
3 [ SolarDate ] [ datetime ] NOT NULL ,
4 [ LunarDate ] [ varchar ] ( 10 ) NOT NULL ,
5 CONSTRAINT [ PK_SolarLunarData ] PRIMARY KEY CLUSTERED
6 (
7 [ SolarDate ] ASC
8 ) WITH (PAD_INDEX = OFF , STATISTICS_NORECOMPUTE = OFF , IGNORE_DUP_KEY = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON ) ON [ PRIMARY ]
9 ) ON [ PRIMARY ]
10
11 GO

4.生成数据于公历农历详细比照表

导入数据至公历农历比照表
 
   
1 TRUNCATE TABLE SolarLunarData
2 GO
3 DECLARE @i INT
4 SET @i = 0
5 WHILE @i < 3000
6 BEGIN
7 INSERT INTO SolarLunarData(SolarDate,LunarDate)
8 SELECT CONVERT ( CHAR ( 10 ), DATEADD (d, @i , ' 2010-01-01 ' ), 23 ),
9 dbo.fn_GetLunar( DATEADD (d, @i , ' 2010-01-01 ' ))
10 SET @i = @i + 1
11 END

 

 5.创建农历获取公历函数

农历获取公历日期函数
 
   
1 IF object_id ( ' fn_GetSolar ' ) IS NOT NULL
2 DROP FUNCTION fn_GetSolar
3   GO
4   CREATE FUNCTION dbo.fn_GetSolar( @day VARCHAR ( 10 ))
5 RETURNS DATETIME
6 AS
7 BEGIN
8 RETURN ( SELECT SolarDate FROM SolarLunarData WHERE LunarDate = @day )
9 END
10 GO

 

 

 

 

 

转载于:https://www.cnblogs.com/s021368/articles/1853371.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以写一个输入阴历生日输出阳历生日的程序,以下是一个简单的C语言实现: ``` #include <stdio.h> int lunar_month_days[13] = {0, 29, 30, 29, 30, 29, 30, 29, 29, 30, 29, 30, 29}; int solar_month_days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int lunar_to_solar(int lunar_year, int lunar_month, int lunar_day) { int i, leap_month, offset, solar_year, solar_month, solar_day; // 先计算阴历日期到公历格林威治时间的偏移天数 offset = 0; for (i = 1; i < lunar_year; i++) { offset += 365; if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) { offset += 1; } } leap_month = ((lunar_year % 4 == 0 && lunar_year % 100 != 0) || lunar_year % 400 == 0) ? 8 : 0; for (i = 1; i < lunar_month; i++) { offset += lunar_month_days[i]; if (i == leap_month) { offset += 1; } } offset += lunar_day - 1; // 再计算出对应的公历日期 solar_year = 1900; while (offset >= (365 + ((solar_year % 4 == 0 && solar_year % 100 != 0) || solar_year % 400 == 0))) { offset -= (365 + ((solar_year % 4 == 0 && solar_year % 100 != 0) || solar_year % 400 == 0)); solar_year++; } leap_month = ((solar_year % 4 == 0 && solar_year % 100 != 0) || solar_year % 400 == 0) ? 1 : 2; solar_month = 1; while (offset >= solar_month_days[solar_month] + ((solar_month == leap_month) ? 1 : 0)) { offset -= solar_month_days[solar_month] + ((solar_month == leap_month) ? 1 : 0); solar_month++; } solar_day = offset + 1; return (solar_year * 10000 + solar_month * 100 + solar_day); } int main() { int lunar_year, lunar_month, lunar_day, solar_date; printf("请输入阴历生日(以年月日顺序输入, 如1988 2 7): "); scanf("%d %d %d", &lunar_year, &lunar_month, &lunar_day); solar_date = lunar_to_solar(lunar_year, lunar_month, lunar_day); printf("阳历生日为: %d\n", solar_date); return 0; } ``` 该程序的原理是通过累加公历格林威治时间与阴历日期之间的天数来计算出对应的公历日期。程序中使用到了两个数组`lunar_month_days`和`solar_month_days`,分别存储阴历和阳历每个月对应的天数。程序还要考虑到闰月的情况,以及闰年的特殊情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值