zoukankan      html  css  js  c++  java
  • 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表

    1.日期函数表作用

        经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免。所以今天就给大家分享一个自定义的做日期表的方法,当然自己使用Excel用公式做一个也很快,八仙过海各显神通。我对C#比较了解,就用自己最了解的方式做了一个。大家可以自己扩充,或者可以把需求提供我,我统一完善。比如下面这个表(来自一个Power Pivot课程)。

    本文原文地址:http://www.cnblogs.com/asxinyu/p/Power_BI_Skills_DateTime_Table.html 

        因为日期函数表主要在建模的时候进行关联,所以是比较固定的,不像业务数据会变动,所以根据所在项目的特殊情况,一次性生成一个时间段的数据足够用了,大不了,更新一下。那先看看我们初级版的日期函数表的结构。

    2.日期函数表结构

        我这里做的格式主要是和上图基本一直,把年份,月份,星期,,季度,月度第N天,年度第N天进行了计算。计算过程都比较简单,都在C#中完成。

        

    3.代码实现过程

        数据库设计,如果大家有新增需求,直接可以在源代码的“时间日期表.cs”修改即可,注意格式。如果熟悉XCode的同学,当然是轻车熟路。由于当初设计已经很久了,XML文件已经找不到了,否则更方便。

        代码很简单就2个主要方法,在“时间日期表.Biz.cs”中的GenerateTable中,上代码:

    /// <summary>
    /// 从指定的日期开始,生成指定天数的时间日期表
    /// </summary>
    /// <param name="date">起始日期</param>
    /// <param name="days">生成的天数,一般一次性生成个前后5年差不多了</param>
    public static void GenerateTable(DateTime date, int days)
    {
    	int i = 0;
    	string[] Day = new string[] { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
    
    	EntityList<DateTimePeriod> list = new EntityList<DateTimePeriod>();
    	while (i < days)
    	{
    		var model = new DateTimePeriod();
    		model.STAT_DATE = date;
    		model.DATES = Convert.ToInt32(date.ToString("yyyyMMdd"));
    		model.YEAR_MONTH = Convert.ToInt32(date.ToString("yyyyMM"));
    		model.YEAR = (short)date.Year;
    		model.MONTH = date.Month.ToString() + "月";
    		int week = Convert.ToInt32(model.STAT_DATE.DayOfWeek);
    		model.WEEK = Day[week];
    		model.QUARTER = (short)Math.Ceiling(date.Month / 3.1);//季度数,向上取整
    		model.DAYS_MONTH = (short)date.Day;
    		model.DAYS_YEAR = (short)date.DayOfYear;
    		model.DAYS_WEED = (short)(week == 0 ? 7 : week);
    		model.MONTH_YEAR = (short)date.Month;
    		model.WEEK_YEAR = (short)GetWeekOfYear(date);
    
    		list.Add(model);
    		i++;
    		date = date.AddDays(1);
    	}
    	list.Save(true);
    }
    /// <summary>
    /// 该日期是每年中的第几周
    /// </summary>
    /// <param name="date"></param>
    /// <returns></returns>
    private static int GetWeekOfYear(DateTime date)
    {
    	//一.找到第一周的最后一天(先获取1月1日是星期几,从而得知第一周周末是几)
    	int firstWeekend = 7 - Convert.ToInt32(DateTime.Parse(date.Year + "-1-1").DayOfWeek);
    
    	//二.获取今天是一年当中的第几天
    	int currentDay = date.DayOfYear;
    	//三.(今天 减去 第一周周末)/7 等于 距第一周有多少周 再加上第一周的1 就是今天是今年的第几周了
    	//    刚好考虑了惟一的特殊情况就是,今天刚好在第一周内,那么距第一周就是0 再加上第一周的1 最后还是1
    	return Convert.ToInt32(Math.Ceiling((currentDay - firstWeekend) / 7.0)) + 1;
    }

        在控制台中执行该方法,可以在bin目录中找到"时间日期表.db",生成的数据就在里面,因为我习惯了使用sqlite文件,大家可以自己导出文件到excel,我在后面提供了工具下载,和Excel版本,会程序的朋友改一改,挺快。

      注意配置文件的连接字符串名称不能随便修改好,当然也可以生成到其他数据库,不过貌似都没必要。

    4.资源

        代码打包:时间日期表C#代码.rar

        数据库文件(2010年-2020年):时间日期表Sqlite数据库.rar

        Excel文件下载(2010年-2020年)时间日期表Excel.rar

       微软Power BI技术交流群: 564786745 (验证注明:博客园Power BI) 

       技术博客:http://www.cnblogs.com/asxinyu/ 

       论坛讨论区:http://www.newlifex.com/

  • 相关阅读:
    .NET中非对称加密RSA算法的密钥保存
    WGS84经纬度坐标到北京54高斯投影坐标的转换[转]
    [APPS] HTC Footprints & HTC Locations for MikG 2.x Read more:
    firefox+ssh无法看youtube视频的解决方案
    【转】sdemon命令实践
    How to share a custom ArcMap command (DLL)
    【转】sdemon命令实践
    红旗桌面版本最新运用法子和结果解答100例8
    红旗Linux桌面4.1文本安装过程图解(二)
    Ubuntu把在效能器范畴起更重要的脚色
  • 原文地址:https://www.cnblogs.com/asxinyu/p/Power_BI_Skills_DateTime_Table.html
Copyright © 2011-2022 走看看