SPO–CAML: Modified greater than returns no elements
In einem meiner letzten Projekte musste ich per CAML Query Elemente aus einer Liste in SharePoint Online abfragen. Eigentlich eine einfache Sache, die aber offensichtlich aber ihre Tücken haben kann, wenn man Zeitwerte prüft. Die Abfrage war schnell erstellt und sah wie folgt aus:
camlQuery.ViewXml = String.Format("<View><Query><Where><And><Eq><FieldRef Name='{0}' /><Value Type='Choice'>{1}</Value></Eq><Gt><FieldRef Name='Modified' /><Value IncludeTimeValue='TRUE' Type='DateTime' >{2}</Value></Gt></And></Where></Query></View>", _StateField, status, lastSyncTime);
In meiner SharePoint Liste habe ich ein einen Listenelement erstellt und die Abfrage gestartet. Zu meiner Verwunderung wurden keine Ergebnisse zurück geliefert, obwohl der neue Listeneintrag neuer als der letzte Synchronisationszeitstempel war.
Nach einiger Recherche habe ich dann die Ursache gefunden. Entscheidend ist die Zeitzone, in der die Site Collection angelegt wurde! In meinem Fall UTC-8.
Demnach war mein Listeneintrag (unter der Haube) immer älter als der UTC-Zeitwert in der Abfrage. (Obwohl in der SharePoint UI immer der umgerechnete Zeitwert für meine Zeitzone angezeigt wurde.)
Um dieses Problem zu umgehen gibt es einen einfachen Tick mit großer Wirkung. In der CAML Abfrage kann das Attribute StorageTZ=’TRUE’ angegeben werden. Dieses sorgt dafür, dass die Zeitwerte der Abfrage auf die Zeitzone der Site Collection intern angepasst werden.
Ich hoffe dies kann euch bei eurem nächsten Projekt Recherchezeit sparen! 🙂