测试农历算法我们创建的是一个农历的函数,当我们将日期传递给这个函数,其就会返回具体的日历了。
SELECT dbo.fn_GetLunar('2019-08-06') Lunar
查看一下返回的结果:
我们去查了一下日历,验证结果是正确的
将农历加入到日历表
已经获得了公历转换成农历的转换函数,我们直接调用该函数即可。修改一下日历表结构和存储过程。更新后的存储过程如下:
CREATE PROC PROC_CALENDAR(@YEAR INT ) AS BEGIN DECLARE @i INT; DECLARE @START_DATE VARCHAR(20); DECLARE @END_DATE VARCHAR(20); DECLARE @DATE_COUNT INT; SET @i=0; --定义一年的开始日期,用CONCAT函数将年份和月份日期拼接起来 SET @START_DATE= CONCAT(@YEAR, '-01-01'); --定义一年的结束日期 SET @END_DATE = CONCAT(@YEAR+1,'-01-01'); --如果表已经存在要新建的日历,则先删除 DELETE FROM CALENDAR_INFO WHERE YEAR = @YEAR; --计算开始到结束日期一共有多少天,DATEDIFF函数计算日期的间隔天数 SET @DATE_COUNT = DATEDIFF(DAY,@START_DATE,@END_DATE); --建立循环,条件是@i小于一年的天数 WHILE @i < @DATE_COUNT BEGIN INSERT INTO CALENDAR_INFO (COUNTRY,CDR_CODE,DATE_NAME, YEAR,MONTH,WEEK,DAY,CDR_DATE,CREATOR,CREATE_DATE,CREATE_INST) SELECT 'CN', 'CN01', --CONVERT函数将@START_DATE转换成指定的格式 CONVERT(CHAR(10),@START_DATE,111) DATE_NAME, --将公历日期转换为农历 dbo.fn_GetLunar(CONVERT(datetime,@start_date,101)) LUNAR, --DATENAME获取@START_DATE的年份 CONVERT(CHAR(4),DATENAME(YEAR, @START_DATE)) YEAR, --DATENAME获取@START_DATE的月份 CONVERT(CHAR(2),DATENAME(MONTH, @START_DATE)) MONTH, --DATENAME获取@START_DATE的星期 CONVERT(CHAR(6),DATENAME(WEEKDAY, @START_DATE)) WEEK, --DATENAME获取@START_DATE的日期 CONVERT(CHAR(2),DATENAME(DAY, @START_DATE)) DAY, CONVERT(CHAR(10),@START_DATE,120) CDR_DATE, '平凡世界', GETDATE() CREATE_DATE, 'Lyven' --插入完成后,对@i进行自加1处理 SET @i=@i+1; --更新@START_DATE的值,在原来的基础上使用DATEADD函数增加一天 SET @START_DATE=CONVERT(CHAR(10),DATEADD(DAY, 1, @START_DATE),120); END END
执行存储过程
EXEC proc_calendar 2019
结果如下:
我们去查了一下日历,验证结果是正确的
日期维度表作用可能有同学会问,花这么大力气就写了个这个,到底有什么用啊?
既然叫维度表,那肯定是跟维度有关了,有了这个维度表,我们可以通过多维数据集来查看不同日期维度的具体数据,特别是应用在可视化报表开发方面。
下面就是一个比较简单的Power BI报表,这里我们就使用到了日期维度表中的年月。
Power BI效果图
至此,一个包含农历的完整日期维度表就生成了,有兴趣的小伙伴可以用MySQL或Oracle进行改写一下。