项目中有个查询模块中用到查询条件: 年和周。 以往我直接指定是第几周,后来测试反映如果直接选择周的话并不知道所选周代表的年月日,而无法最快查询数据,后更改查询条件如下: 指定一个起始年月,根据起始年月计算出第一周的日子,然后在第一周的基础上计算剩余周。
效果图:
算法代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 |
List<dynamic> list2 = new
List<dynamic>(); DateTime startDate = DateTime.Parse( "2014"
+ "-01-01" ); DateTime endDate = DateTime.Parse( "2014"
+ "-12-31" ); TimeSpan ts = (TimeSpan)(endDate - startDate); int
countday = int .Parse(ts.TotalDays.ToString()); //总天数 int startweek = Convert.ToInt32(startDate.DayOfWeek.ToString( "d" )); //开始日期星期几 startweek = startweek == 0 ? 7 : startweek; //星期日为0改为7 DateTime startDate2 = startDate.AddDays(-startweek + 1); //把第一周凑满的开始日期 countday += startweek - 1; //再计算总天数 double
countweek = Math.Ceiling(( double )countday / 7); if (countweek > 0) { list2.Add( new
{ ID = 1, Name = "第1周("
+ startDate.ToString( "yyyy-MM-dd" ) + "/"
+ (startDate2.AddDays(6)).ToString( "yyyy-MM-dd" ) + ")"
}); } for
( int
w = 2; w <= countweek; w++) { if
(w != countweek) { list2.Add( new
{ ID = w, Name = "第"
+ w.ToString() + "周("
+ startDate2.AddDays(7 * (w - 1)).ToString( "yyyy-MM-dd" ) + "/"
+ (startDate2.AddDays((7 * w) - 1).ToString( "yyyy-MM-dd" )) + ")"
}); } else { list2.Add( new
{ ID = w, Name = "第"
+ w.ToString() + "周("
+ startDate2.AddDays(7 * (w - 1)).ToString( "yyyy-MM-dd" ) + "/"
+ (endDate.ToString( "yyyy-MM-dd" )) + ")"
}); } } ddlHoursdistribution.DataSource = list2; ddlHoursdistribution.DataBind(); |
关键点就是根据开始日期计算第一周的时间,比如2013-1-1周二,那么就在周的基础上减去1天,等于起点就到2012-12-30了,然后在这个基础上+6,完成第一周的计算,剩下的就直接在计算后的日期上相加,由于个人对算法的知识了解的少,请教同事后得出该算法,感谢我的同事。
根据起止日期构建指定查询条件:第N周(yyyy-MM-dd/yyyy-MM-dd)
原文:http://www.cnblogs.com/sword-successful/p/3551748.html