2009-10-05 4 views
6

In einer SharePoint-Kalenderliste erstelle ich zwei Ereignisse mit dem heutigen Datum. Eine mache ich eine ganztägige Veranstaltung, die andere stelle ich die Startzeit auf 12 Uhr und die Endzeit auf 23:55 Uhr.SharePoint - ganztägige Ereignisse verhalten sich in der CAML-Abfrage unterschiedlich

Wenn ich eine CAML-Abfrage erstellen (in diesem Fall mit "U2U CAML Query Builder"), sehe ich ein seltsames Verhalten. Wenn meine Abfrage eine einfache "OrderBy" ist, werden beide Ereignisse zurückgegeben.

Wenn ich die folgende Abfrage ausführen, die für Veranstaltungen sucht, die größer als oder gleich heute sind, nur das Ereignis, das NICHT als „All Day Event“ markiert ist zurückgegeben:

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

Prüfungs die Ergebnisse aus dem Abfrage-Generator-Tool Ich sehe, dass die Werte für EventDate (der interne Name der Spalte Startzeit) 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, das könnte ein Zeitzonenproblem sein. Ich entdeckte das Attribut "IncludeTimeValue" des Value-Elements - hier beschrieben: MSDN. Ich bin an der Ostküste (derzeit GMT - 4 Stunden). Wenn ich das Value Element bearbeiten wie folgt: (beachten Sie das Datum ist jetzt die vierte, nicht 5.)

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

Dann werden beide Ereignisse zurückgegeben werden, aber wenn ich zu 20.01 steigen dann verliere ich den ganzen Tag über Veranstaltung. Wenn ich zu 20:01 gehe, verliere ich auch das ganztägige Ereignis. Wer weiß, wo ich eine gründliche Beschreibung dieses Verhaltens finden kann?

EDIT2: Ich habe mich verwirrt; Die erste Änderung wurde korrigiert.

Antwort

6

SharePoint speichert das Datum/die Uhrzeit in UTC (auch GMT oder Zulu genannt) und konvertiert sie bei der Anzeige zuerst in die lokale Zeitzone der Websites.

Allerdings für ganztägige Veranstaltungen speichert es die Zeiten (00:00 bis 23:59:00) in den Standorten LOCAL Zeitzone statt.

Wie Sie bereits selbst herausgefunden haben - ich glaube, Sie haben einen Fehler in der Art gefunden, wie die SharePoint die Abfrage interpretiert und vergessen, dass ganztägige Ereignisse Ortszeit sind.

Ich denke, man könnte eine unangenehme Abhilfe dies tun, indem Sie eine Abfrage für

tun eventdate> = SomeDate OR AllDayEvent = True AND eventdate> = SomeDate - 4hrs

Dieses Plakat hat ähnliche Probleme SO - SharePoint all day event gives obscure result

Und dies wird Ihnen etwas mehr Einblick, wie borked Zeitzonen sind in Sharepoint SharePoint Web Services and UTC time fun and games

Und wenn das nicht genug Frustration für Sie ist, dann schauen Sie auf Erstellt/Modifizierte Daten über das Objektmodell und staunen Sie darüber, wie sie als Ortszeit für normale Ereignisse und UTC für ganztägige Ereignisse gemeldet werden!

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

einen Zeitspanne Wert hinzufügen wie:

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

Dies sollte das Problem beheben.

1

Wenn die Ergebnisse einer CAML Abfrage Verarbeitung wird das Problem dadurch lösen, 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: dieses Update vorausgesetzt, dass Sie nicht die Suche nach Tag begrenzen. Offensichtlich würde es in diesem Fall nicht helfen, es sei denn, Sie haben die Suchparameter so erweitert, dass sie einen größeren Bereich enthalten, als Sie tatsächlich benötigen.

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

Insbesondere dieser Fix funktioniert, wenn Sie nach Monat abfragen und nur Kalenderelemente anzeigen, die in diesem Monat vorhanden sind. In diesem Fall gibt CAML die letzten Tage eines vorherigen Monats und die ersten paar des nächsten Monats zurück, so dass Sie die Daten, die um einen Tag verschoben werden, nicht verlieren. (unter Verwendung <Month />)

+0

Convert.ToBoolean (Element ["fAllDayEvent"]) war genau das, wonach ich suchte. Vielen Dank! –

0

Das funktionierte für mich.

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