SharePoint - события на весь день ведут себя по-разному в CAML-запросе - PullRequest
7 голосов
/ 05 октября 2009

В списке календарей SharePoint я создаю два события с сегодняшней датой. Один я делаю на целый день, другой я назначаю время начала 12:00, а время окончания - 23:55.

Когда я создаю запрос CAML (в данном случае с "U2U CAML Query Builder"), я вижу странное поведение. Когда мой запрос прост "OrderBy", возвращаются оба события.

Когда я выполняю следующий запрос, который ищет события, которые больше или равны сегодняшнему дню, возвращается только событие, НЕ помеченное как «Событие на весь день»:

<Where>
    <Geq>
        <FieldRef Name='EventDate' />
        <Value Type='DateTime'>2009-10-05T00:00:00Z</Value>
    </Geq>
</Where>

Изучение результатов с помощью инструмента построителя запросов показывает, что значения EventDate (внутреннее имя столбца Start Time) идентичны (2009-10-05 00:00:00).

Почему SharePoint обрабатывает эти два события одинаково? Это может быть проблема с часовым поясом?

РЕДАКТИРОВАТЬ: Больше информации, я думаю, что это может быть проблема часового пояса. Я обнаружил атрибут «IncludeTimeValue» элемента Value, описанный здесь: MSDN . Я на восточном побережье (в настоящее время по Гринвичу - 4 часа). Если я отредактирую элемент Value следующим образом: (обратите внимание, что теперь дата 4, а не 5)

<Value Type='DateTime' IncludeTimeValue='True'>2009-10-04T20:00:00Z</Value>

Тогда оба события возвращаются, но если я дохожу до 20:01, тогда я теряю событие на весь день. Когда я иду в 20:01, я также проигрываю весь день. Кто-нибудь знает, где я могу найти подробное описание этого поведения?

EDIT2: я запутался; исправлено первое редактирование.

Ответы [ 4 ]

7 голосов
/ 05 октября 2009

SharePoint сохраняет дату / время в UTC (он же GMT ​​или Zulu) и при отображении сначала преобразует ее в местный часовой пояс сайтов.

Однако для событий на весь день вместо этого он сохраняет время (от 00:00 до 23:59:00) в часовом поясе сайтов.

Как вы уже выяснили сами - я полагаю, вы обнаружили ошибку в том, как SharePoint интерпретирует запрос, и он забыл, что события всего дня имеют местное время.

Полагаю, вы могли бы решить эту проблему, выполнив запрос для

EventDate> = SomeDate ИЛИ ЖЕ AllDayEvent = True AND EventDate> = SomeDate - 4 часа

У этого постера похожие проблемы SO - событие SharePoint в течение всего дня дает неясный результат

И это даст вам некоторое представление о том, как работают часовые пояса в SharePoint. Веб-службы SharePoint и UTC, развлечения и игры

И если вам не хватает разочарования, посмотрите на даты Создания / Изменения через объектную модель и удивитесь, как они сообщаются как Местное время для обычных событий и UTC для событий всего дня!

1 голос
/ 28 апреля 2011

При обработке результатов запроса CAML это решит проблему, но не идеально:

foreach (SPListItem item in _items){

     //   ... loop for processing items returned from CAML query, 
     //       code unrelated to UTC conversion excluded

      var localSDate = Convert.ToDateTime(item["StartDate"].ToString());

      if (Convert.ToBoolean(item["fAllDayEvent"])){
            localSDate = localSDate.ToUniversalTime();
      }
}

ПРИМЕЧАНИЕ: это исправление предполагает, что вы не ограничиваете поиск днем. очевидно, в этом случае это не поможет, если вы не расширили параметры поиска, включив в него более широкий диапазон, чем вам на самом деле нужно возвращать.

Я знаю, что это не совсем то, что ищет плакат, но это может помочь другим, кто найдет эту страницу ... по этому вопросу не так много задокументировано.

В частности, это исправление будет работать, если вы запрашиваете по месяцам и отображаете только те элементы календаря, которые существуют в этом месяце. В этом случае CAML в любом случае вернет последние несколько дней предыдущего месяца и первые несколько следующих месяцев, поэтому вы не потеряете данные, смещенные на один день. (используя <Month />)

1 голос
/ 24 августа 2010
oQuery.Query = "<Where><Geq><FieldRef Name='EventDate' /><Value Type='DateTime'>" + SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Today.Subtract(new TimeSpan(1))) + "</Value></Geq></Where>"

Добавление значения Timespan, например:

SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Today.Subtract(new TimeSpan(1)))
"2010-08-23T23:59:59Z"

Это должно решить проблему.

0 голосов
/ 27 сентября 2013

Это сработало для меня.

<Where>
<Or>
    <Or>
        <And>
            <Eq>
                <FieldRef Name='fAllDayEvent' />
                <Value Type='AllDayEvent'>1</Value>
            </Eq>
            <Geq>
                <FieldRef Name='EndDate' />
                <Value Type='DateTime'>
                    <Today />
                </Value>
            </Geq>
        </And>
        <DateRangesOverlap>
          <FieldRef Name='EventDate' />
          <FieldRef Name='EndDate' />
          <FieldRef Name='RecurrenceID' />
          <Value Type='DateTime' IncludeTimeValue='TRUE'>
            <Today />
          </Value>
        </DateRangesOverlap>
    </Or>
   <Geq>
      <FieldRef Name='EventDate' />
      <Value Type='DateTime' IncludeTimeValue='TRUE'>
         <Today />
      </Value>
   </Geq>
</Or>
</Where>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...