SQL如何制作带农历的日期维度表(下)

简介: 农历与世界通用的日历有所区别,是科学家演算出来的,目前为止只有到2049年的,以后的有了还可以加入! 所以我们可以把已经演算出来的具体农历制作成一张表,通过调用当前的日期来返回具体的农历。

测试农历算法我们创建的是一个农历的函数,当我们将日期传递给这个函数,其就会返回具体的日历了。

SELECT dbo.fn_GetLunar('2019-08-06') Lunar

查看一下返回的结果:

30.jpg

我们去查了一下日历,验证结果是正确的

31.jpg

将农历加入到日历表

已经获得了公历转换成农历的转换函数,我们直接调用该函数即可。修改一下日历表结构和存储过程。更新后的存储过程如下:

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


结果如下:

32.jpg

我们去查了一下日历,验证结果是正确的

33.jpg

日期维度表作用可能有同学会问,花这么大力气就写了个这个,到底有什么用啊?

既然叫维度表,那肯定是跟维度有关了,有了这个维度表,我们可以通过多维数据集来查看不同日期维度的具体数据,特别是应用在可视化报表开发方面。

下面就是一个比较简单的Power BI报表,这里我们就使用到了日期维度表中的年月。

34.gif

Power BI效果图


至此,一个包含农历的完整日期维度表就生成了,有兴趣的小伙伴可以用MySQL或Oracle进行改写一下。


相关文章
|
1月前
|
SQL Oracle 关系型数据库
SQL 的 with as 临时中间表
SQL 的 with as 临时中间表
24 1
|
1月前
|
SQL 数据库
SQL-修改表操作
SQL-修改表操作
|
1月前
|
SQL 存储 关系型数据库
SQL语句-表操作
SQL语句-表操作
|
1月前
|
SQL Java 数据库连接
这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
【1月更文挑战第17天】【1月更文挑战第85篇】这个问题是由于Flink在执行SQL语句时,无法找到合适的表工厂来处理JOIN操作。
19 8
|
1月前
|
SQL 流计算
在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
【1月更文挑战第4天】【1月更文挑战第18篇】在Flink SQL中,如果在使用表别名后,WHERE子句中使用了别名,可能会出现找不到表的问题
20 1
|
1月前
|
SQL 自然语言处理 数据挖掘
「SQL面试题库」 No_115 按日期分组销售产品
「SQL面试题库」 No_115 按日期分组销售产品
|
1月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_82 报告系统状态的连续日期
「SQL面试题库」 No_82 报告系统状态的连续日期
|
1月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_75 重新格式化部门表
「SQL面试题库」 No_75 重新格式化部门表
|
27天前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之数据查询
【数据库SQL server】关系数据库标准语言SQL之数据查询
46 0
|
27天前
|
SQL 算法 数据库
【数据库SQL server】关系数据库标准语言SQL之视图
【数据库SQL server】关系数据库标准语言SQL之视图
37 0