时间:2010-07-24 14:58:01

标签: c# sharepoint

2 个答案:

答案 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"]);
}

关于使用的一些注意事项:

  1. 日期范围的开始日期必须小于或等于 结束日期,但我认为这是一个可接受的限制。
  2. 在你问之前,我没有经常性地测试这个解决方案 事件,但我认为在这种情况下它不起作用。对不起!
  3. 将我作为DateTime存储的日期转换为我之前使用过的字符串 具有格式模式的DateTime.ToString(String format)方法 “yyyy-MM-ddT00:00:00Z”,后来我发现或多或少匹配 UniversalSortableDateTimePattern,因此切换到参数“u”。如果 你查看的源代码 SPUtility.CreateISO8601DateTimeFromSystemDateTime方法 这个样本(例如使用Reflector),你可以看到它 简单地用正确的模式调用DateTime.ToString,它需要 DateTime的各个部分(如年,月,日等), 并通过将这些组件相互附加来创建结果 使用StringBuilder。起初对我来说很奇怪,但是 然后想,它必须是最快的转换方式,就像它一样 没有模式识别和许多条件的开销 在DateTime.ToString中找到。但是,如果你应该与时间一起工作 区域信息,那么它可能不适合你。虽然ISO 8601支持时区,AFAIS未实现 例如,通过提供CreateISO8601DateTimeFromSystemDateTime 带有DateTimeOffset参数的重载。我不知道CAML 支持所有这种时区提供的信息 日期字符串。我承认在大多数情况下这不是一个至关重要的问题, 但如果不加以考虑,它可能会产生惊喜。您 可以阅读更多关于here
  4. 的信息