Сравните DateTime для ежедневной, еженедельной и ежемесячной длительности в запросе CAML.

У меня есть 3 даты, вставленные в мой список, и они:

  • 01.01.2014 19:00 ежедневно
  • 02.12.2013 19:00 еженедельно
  • 26.12.2013 19:00 ежемесячно

Я хочу запросить CAML таким образом, чтобы моя текущая дата и время была 02.01.2014 18:22. Я хочу, чтобы все эти записи были выбраны, поскольку они относятся к следующему часу и заданной продолжительности.
Пожалуйста, кто-нибудь может предложить мне, как написать запрос для этого?

Запрос CAML выглядит следующим образом:

<Query>
<Where>
  <Or>
     <And>
        <Eq>
           <FieldRef Name='DeliveryFrequency' />
           <Value Type='Choice'>Daily</Value>
        </Eq>
        <And>
           <Geq>
              <FieldRef Name='LastDeliveryTime' />
              <Value Type='DateTime'>[Today-1Day(s)]</Value>
           </Geq>
           <And>
              <Geq>
                 <FieldRef Name='LastDeliveryTime' />
                 <Value IncludeTimeValue='TRUE' Type='DateTime'>[Now-1Day(s)]</Value>
              </Geq>
              <Leq>
                 <FieldRef Name='LastDeliveryTime' />
                 <Value IncludeTimeValue='TRUE' Type='DateTime'>[Now+60Minute(s)]</Value>
              </Leq>
           </And>
        </And>
     </And>
     <Or>
        <And>
           <Eq>
              <FieldRef Name='DeliveryFrequency' />
              <Value Type='Choice'>Weekly</Value>
           </Eq>
           <And>
              <Eq>
                 <FieldRef Name='LastDeliveryTime' />
                 <Value Type='DateTime'>[Today-7Day(s)]</Value>
              </Eq>
              <And>
                 <Geq>
                    <FieldRef Name='LastDeliveryTime' />
                    <Value IncludeTimeValue='TRUE' Type='DateTime'>[Now-7Day(s)]</Value>
                 </Geq>
                 <Leq>
                    <FieldRef Name='LastDeliveryTime' />
                    <Value IncludeTimeValue='TRUE' Type='DateTime'>[Now-7Day(s)+60Minute(s)]</Value>
                 </Leq>
              </And>
           </And>
        </And>
        <And>
           <Eq>
              <FieldRef Name='DeliveryFrequency' />
              <Value Type='Choice'>Monthly</Value>
           </Eq>
           <And>
              <Eq>
                 <FieldRef Name='LastDeliveryTime' />
                 <Value Type='DateTime'>[Today-1Month(s)]</Value>
              </Eq>
              <And>
                 <Geq>
                    <FieldRef Name='LastDeliveryTime' />
                    <Value IncludeTimeValue='TRUE' Type='DateTime'>[Now-1Month(s)]</Value>
                 </Geq>
                 <Leq>
                    <FieldRef Name='LastDeliveryTime' />
                    <Value IncludeTimeValue='TRUE' Type='DateTime'>[Now-1Month(s)+60Minute(s)]</Value>
                 </Leq>
              </And>
           </And>
        </And>
     </Or>
  </Or>

Это мой запрос отлично работает с компоновщиком запросов CAML, но в SPQuery он не возвращает никаких записей. Я попытался предоставить ViewAttributes для «RecursiveAll». Что не так с данным кодом?


person Suresh    schedule 02.01.2014    source источник
comment
stackoverflow.com/questions/4648517 /   -  person Iman    schedule 05.04.2014


Ответы (1)


Я решил эту ошибку самостоятельно. Я удалил встроенную функцию, как сегодня, и теперь со своим собственным значением со стороны кода.

  Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(
DateTime.Now.AddMonths(-1))

Более полный образец

string queryString_getPersonalAlerts = string.Format(@"<Where><Or>
            <And><Eq><FieldRef Name='{0}' />
            <Value Type='Choice'>Daily</Value></Eq><And><Geq><FieldRef Name='{1}' />
            <Value Type='DateTime'>{2}</Value></Geq><And><Geq><FieldRef Name='{1}' />
            <Value IncludeTimeValue='TRUE' Type='DateTime'>{2}</Value></Geq><Leq><FieldRef Name='{1}' />
            <Value IncludeTimeValue='TRUE' Type='DateTime'>{3}</Value></Leq></And></And></And><Or><And><Eq><FieldRef Name='{0}' />
            <Value Type='Choice'>Weekly</Value></Eq><And><Eq><FieldRef Name='{1}' />
            <Value Type='DateTime'>{4}</Value></Eq><And><Geq><FieldRef Name='{1}' />
            <Value IncludeTimeValue='TRUE' Type='DateTime'>{4}</Value></Geq><Leq><FieldRef Name='{1}' />
            <Value IncludeTimeValue='TRUE' Type='DateTime'>{5}</Value></Leq></And></And></And><And><Eq><FieldRef Name='{0}' />
            <Value Type='Choice'>Monthly</Value></Eq><And><Eq><FieldRef Name='{1}' />
            <Value Type='DateTime'>{6}</Value></Eq><And><Geq><FieldRef Name='{1}' />
            <Value IncludeTimeValue='TRUE' Type='DateTime'>{6}</Value></Geq><Leq><FieldRef Name='{1}' />
            <Value IncludeTimeValue='TRUE' Type='DateTime'>{7}</Value></Leq></And></And></And></Or></Or></Where>",    
         PersonalAlerts.Fields.DeliveryFrequency.ToString(),     
        PersonalAlerts.Fields.LastDeliveryTime.ToString(),
    SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddDays(-1)), 
        SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddDays(-1).AddMinutes(60)), 
SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddDays(-7)), 
        SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddDays(-7).AddMinutes(60)), 
        SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddMonths(-1)), 
        SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now.AddMonths(-1).AddMinutes(60)));
person Suresh    schedule 03.01.2014