答案 0 :(得分:1)
答案 1 :(得分:1)
我刚刚为此问题发布了solution。我希望它能回答你的问题。
我在this question找到的主题中最简单的方法和最好的描述。它说,当两个日期范围都为真时,日期范围是重叠的,它们的开始日期不晚于其他日期范围的结束日期。如果你只考虑一下,那就很清楚了。
基于这个概念,我创建了两个辅助方法:
protected String BuildDateRangeOverlapFilter(DateTime startDate, DateTime endDate)
{
StringBuilder sb = new StringBuilder();
sb.Append(String.Format("<Where><And>{0}{1}</And></Where>",
BuildSimpleDateFilter("StartDate", endDate, "Leq"),
BuildSimpleDateFilter("DueDate", startDate, "Geq")));
return sb.ToString();
}
protected String BuildSimpleDateFilter(String dateFieldName, DateTime filterDate, String relation)
{
String filter = String.Format("<{0}><FieldRef Name='{1}'/><Value Type='DateTime'>{2}</Value></{0}>",
relation, dateFieldName, SPUtility.CreateISO8601DateTimeFromSystemDateTime(filterDate));
return filter;
}
以下是有关用法的示例:
DateTime startDate = DateTime.Today.AddDays(11);
DateTime endDate = DateTime.Today.AddDays(15);
SPList taskList = web.Lists["Tasks"];
SPQuery query = new SPQuery();
query.ViewFields = "<FieldRef Name='Title'/><FieldRef Name='StartDate'/><FieldRef Name='DueDate'/>";
query.Query = BuildDateRangeOverlapFilter(startDate, endDate);
SPListItemCollection matches = taskList.GetItems(query);
foreach (SPListItem match in matches)
{
Console.WriteLine(match["Title"]);
}
关于使用的一些注意事项: