7 Stimmen

SharePoint - ganztägige Ereignisse verhalten sich in der CAML-Abfrage anders

In einer SharePoint-Kalenderliste erstelle ich zwei Ereignisse mit dem heutigen Datum. Eines davon ist ein ganztägiges Ereignis, für das andere setze ich die Startzeit auf 12 Uhr und die Endzeit auf 23:55 Uhr.

Wenn ich eine CAML-Abfrage erstelle (in diesem Fall mit dem "U2U CAML Query Builder"), erkenne ich ein merkwürdiges Verhalten. Wenn meine Abfrage eine einfache "OrderBy" ist, werden beide Ereignisse zurückgegeben.

Wenn ich die folgende Abfrage ausführe, die nach Ereignissen sucht, die größer oder gleich dem heutigen Tag sind, wird nur das Ereignis, das NICHT als "Ganztägige Veranstaltung" gekennzeichnet ist, wird zurückgegeben:

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

Bei der Prüfung der Ergebnisse aus dem Abfrageerstellungstool sehe ich, dass die Werte für EventDate (der interne Name der Spalte Start Time) identisch sind (2009-10-05 00:00:00).

Warum behandelt SharePoint diese beiden Ereignisse identisch? Könnte es ein Zeitzonenproblem sein?

EDIT: Weitere Informationen, ich denke, es könnte ein Problem mit der Zeitzone sein. Ich entdeckte das Attribut "IncludeTimeValue" des Elements Value - hier beschrieben: エムエスディーエヌ . Ich befinde mich an der Ostküste (derzeit GMT - 4 Stunden). Wenn ich die Value Element wie folgt: (beachten Sie, dass das Datum jetzt der 4. und nicht der 5. ist)

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

Dann werden beide Ereignisse zurückgegeben, aber wenn ich bis 20:01 Uhr gehe, verliere ich das ganztägige Ereignis. Wenn ich bis 20:01 Uhr gehe, verliere ich auch das ganztägige Ereignis. Weiß jemand, wo ich eine ausführliche Beschreibung dieses Verhaltens finden kann?

EDIT2: Ich habe mich verwirrt; ich habe die erste Bearbeitung korrigiert.

8voto

Ryan Punkte 23331

SharePoint speichert das Datum/die Uhrzeit in UTC (auch bekannt als GMT oder Zulu) und konvertiert es beim ersten Anzeigen in die lokale Zeitzone der Website.

Bei ganztägigen Ereignissen werden die Zeiten (00:00 bis 23:59:00) stattdessen in der LOKALEN Zeitzone der Website gespeichert.

Wie Sie bereits selbst herausgefunden haben - ich glaube, Sie haben einen Fehler in der Art und Weise gefunden, wie SharePoint die Abfrage interpretiert und vergisst, dass alle Tagesereignisse Ortszeit sind.

Ich schätze, man könnte das Problem umgehen, indem man eine Abfrage für

EventDate >= SomeDate OR AllDayEvent = True AND EventDate >= SomeDate - 4hrs

Dieses Poster hat ähnliche Probleme SO - Ganztägige SharePoint-Veranstaltung mit undurchsichtigem Ergebnis

Und dies gibt Ihnen einen weiteren Einblick in die fehlerhaften Zeitzonen in SharePoint SharePoint Web Services und UTC Zeitspaß und Spiele

Und wenn das nicht genug Frustration für Sie ist, dann schauen Sie sich die Erstellungs-/Änderungsdaten über das Objektmodell an und wundern Sie sich, wie sie als Ortszeit für normale Ereignisse und UTC für ganztägige Ereignisse gemeldet werden!

1voto

Kidar Punkte 11
oQuery.Query = "<Where><Geq><FieldRef Name='EventDate' /><Value Type='DateTime'>" + SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Today.Subtract(new TimeSpan(1))) + "</Value></Geq></Where>"

Hinzufügen eines Zeitspannenwertes wie:

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

Damit sollte das Problem behoben sein.

1voto

NWilliams Punkte 81

Bei der Verarbeitung der Ergebnisse einer CAML-Abfrage löst dies das Problem, ist aber nicht ideal:

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();
      }
}

HINWEIS: Diese Lösung setzt voraus, dass Sie die Suche nicht nach Tagen einschränken. In diesem Fall würde sie natürlich nicht helfen, es sei denn, Sie haben die Suchparameter so erweitert, dass sie einen größeren Bereich einschließen, als Sie tatsächlich zurückgeben müssen.

Ich weiß, dass es nicht genau das ist, wonach der Poster sucht, aber das könnte anderen helfen, die diese Seite finden... es gibt nicht viel Dokumentiertes zu diesem Thema.

Diese Korrektur funktioniert insbesondere, wenn Sie eine Abfrage nach Monat durchführen und nur Kalendereinträge anzeigen, die in diesem Monat existieren. In diesem Fall gibt CAML ohnehin die letzten Tage des Vormonats und die ersten Tage des nächsten Monats zurück, so dass Sie die um einen Tag versetzten Daten nicht verlieren. (mit <Month /> )

0voto

James Punkte 12410

Das hat bei mir funktioniert.

<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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X