去年的時候寫了一個統計功能,是按周統計的。
利用用Sql中的DATEPART(WK,CreateTime),datepart(week , '2013-01-01'), SET DATEFIRST 7 等方法獲取當前周數結合Group by實現的。
在前台顯示的時候從網上找了一段代碼標注了每周的起始日期和結束日期,當時也沒怎么注意,可昨天收到郵件反饋說“未來日期的統計結果也出來了”,於是打開統計后台一看,2013年第10周,赫然顯示着3-11到3-17,可是查詢年當天才3號啊。
也許我從網上找的那段代碼有問題,也許我不會使用傳錯了參數,總之這個周數和起始日期與數據庫的對應不上了。
然后我就自己改寫出來一個跟MS Sql數據庫的默認設置對應的取指定年指定周開始和結束日期的方法。
代碼的一部分來自原來從網上找的代碼,經過我的加工跟之前的邏輯有些不一樣了。
使用時候判斷返回結果再使用,否則周期數錯誤時可能返回的日期有誤。
代碼如下:
1 /// <summary> 2 /// 獲取指定周數的開始日期和結束日期,開始日期為周日 3 /// </summary> 4 /// <param name="year">年份</param> 5 /// <param name="index">周數</param> 6 /// <param name="first">當此方法返回時,則包含參數 year 和 index 指定的周的開始日期的 System.DateTime 值;如果失敗,則為 System.DateTime.MinValue。</param> 7 /// <param name="last">當此方法返回時,則包含參數 year 和 index 指定的周的結束日期的 System.DateTime 值;如果失敗,則為 System.DateTime.MinValue。</param> 8 /// <returns></returns> 9 public static bool GetDaysOfWeeks(int year, int index, out DateTime first, out DateTime last) 10 { 11 first = DateTime.MinValue; 12 last = DateTime.MinValue; 13 if (year < 1700 || year > 9999) 14 { 15 //"年份超限" 16 return false; 17 } 18 if (index < 1 || index > 53) 19 { 20 //"周數錯誤" 21 return false; 22 } 23 DateTime startDay = new DateTime(year, 1, 1); //該年第一天 24 DateTime endDay = new DateTime(year + 1, 1, 1).AddMilliseconds(-1); 25 int dayOfWeek = Convert.ToInt32(startDay.DayOfWeek); //該年第一天為星期幾 29 if (index == 1) 30 { 31 first = startDay; 32 if (dayOfWeek == 6) 33 { 34 last = first; 35 } 36 else 37 { 38 last = startDay.AddDays((6-dayOfWeek)); 39 } 40 } 41 else 42 { 43 first = startDay.AddDays((7 - dayOfWeek) + (index - 2) * 7); //index周的起始日期 44 last = first.AddDays(6); 45 if (last > endDay) 46 { 47 last = endDay; 48 } 49 } 50 if (first > endDay) //startDayOfWeeks不在該年范圍內 51 { 52 //"輸入周數大於本年最大周數"; 53 return false; 54 } 55 return true; 56 }
修改后的統計效果圖: