標籤:微軟 今天 sqlite str 修改 關聯 tar file 資料庫
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 最後還是1return 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技術交流群: 553499910 (驗證註明:部落格園Power BI)
技術部落格:http://www.cnblogs.com/asxinyu/
論壇討論區:http://www.newlifex.com/
一起學微軟Power BI系列-提示(5)自訂PowerBI時間日期表