去年的时候写了一个统计功能,是按周统计的。
利用用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 }
修改后的统计效果图: