2009-10-05 5 views
6

Dans une liste de calendriers SharePoint, je crée deux événements avec la date du jour. Un que je fais un événement d'une journée, l'autre j'ai placé l'heure de départ à 12 heures et l'heure de fin à 23:55.SharePoint - les événements d'une journée se comportent différemment dans la requête CAML

Lorsque je crée une requête CAML (dans ce cas w/"U2U CAML Query Builder"), je vois un comportement étrange. Lorsque ma requête est un simple "OrderBy", les deux événements sont renvoyés.

Lorsque j'exécute la requête suivante qui recherche pour les événements qui sont supérieurs ou égaux à nos jours, seul l'événement qui est PAS marqué comme un « Événement » est retourné:

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

examen les résultats de l'outil de création de requête Je vois que les valeurs de EventDate (le nom interne de la colonne Start Time) sont identiques (2009-10-05 00:00:00).

Pourquoi SharePoint traite ces deux événements de manière identique? Serait-ce un problème de fuseau horaire?

EDIT: Plus d'infos, je pense que cela pourrait être un problème de fuseau horaire. J'ai découvert l'attribut "IncludeTimeValue" de l'élément Value - décrit ici: MSDN. Je suis sur la côte Est (actuellement GMT - 4 heures). Si je modifie l'élément Value comme suit: (notez la date est maintenant 4ème, 5ème pas)

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

Ensuite, les deux événements sont retournés, mais si je vais jusqu'à 20h01 alors je perds le tout jour un événement. Quand je vais à 20h01, je perds aussi toute la journée. Quelqu'un sait où je peux trouver une description complète de ce comportement?

EDIT2: Je me suis confondu; corrigé le premier edit.

Répondre

6

SharePoint stocke la date/heure en UTC (alias GMT ou Zulu) et lors de l'affichage, le convertit d'abord en fuseau horaire local.

Toutefois, pour les événements Toute la journée, il stocke les heures (00:00 à 23:59:00) dans le fuseau horaire local LOCAL à la place.

Comme vous l'avez déjà compris vous-même - je crois que vous avez trouvé un bug dans la manière dont SharePoint interprète la requête et son oubli que tous les événements de la journée sont des heures locales.

Je suppose que vous pourriez faire une solution de contournement méchante cela en faisant une requête pour

EventDate> = SomeDate OU AllDayEvent = True ET EventDate> = SomeDate - 4 heures

Cette affiche a des problèmes similaires SO - SharePoint all day event gives obscure result

Et cela vous donnera une meilleure idée de la façon dont les zones de temps dans SharePoint sont complètement foireuse SharePoint Web Services and UTC time fun and games

Et si ce n'est pas assez frustrant pour vous alors regardez les dates créées/modifiées via le modèle d'objet et admirez comment ils sont signalés comme heure locale pour les événements normaux et UTC pour les événements toute la journée!

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

Ajout d'une valeur Timespan comme:

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

Cela devrait résoudre le problème.

1

Lors du traitement des résultats d'une requête CAML, cela résoudra le problème, mais n'est pas idéal:

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

REMARQUE: ce correctif suppose que vous ne limitons pas la recherche par jour. évidemment, dans ce cas, cela n'aiderait pas, sauf si vous avez étendu les paramètres de recherche pour inclure une plage plus large que celle dont vous avez réellement besoin.

Je sais que ce n'est pas exactement ce que l'affiche recherche, mais cela pourrait aider d'autres personnes qui trouvent cette page ... il n'y a pas beaucoup de documentation sur ce problème. En particulier, ce correctif fonctionnera si vous effectuez une recherche par mois et que vous affichez uniquement les éléments de calendrier qui existent dans ce mois-là. Dans ce cas, CAML renverra les derniers jours du mois précédent et les premiers mois du mois prochain, de sorte que vous ne perdrez pas les données compensées par un jour. (en utilisant <Month />)

+0

Convert.ToBoolean (item ["fAllDayEvent"]) était exactement ce que je cherchais. Merci! –

0

Cela a fonctionné pour moi.

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