2009-10-05 21 views
6

En una lista de calendario de SharePoint, creo dos eventos con la fecha de hoy. Uno hago un evento de todo el día, el otro establezco que la hora de inicio es a las 12 a.m. y la hora de finalización es a las 11:55 p.m.SharePoint: los eventos de todo el día se comportan de manera diferente en la consulta CAML

Cuando creo una consulta CAML (en este caso con "U2U CAML Query Builder") veo un comportamiento extraño. Cuando mi consulta es un simple "OrderBy", se devuelven ambos eventos.

Cuando ejecuto la siguiente consulta que busca eventos que son mayores o iguales a día de hoy, sólo el evento que es NO marcados como "Todo el día" se devuelve:

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

Examinar los resultados de la herramienta de creación de consultas veo que los valores para EventDate (el nombre interno de la columna Hora de inicio) son idénticos (2009-10-05 00:00:00).

¿Por qué SharePoint trata estos dos eventos de forma idéntica? ¿Podría ser un problema de zona horaria?

EDITAR: Más información, creo que esto podría ser un problema de zona horaria. Descubrí el atributo "IncludeTimeValue" del elemento Value, que se describe aquí: MSDN. Estoy en la costa este (actualmente GMT, 4 horas). Si puedo editar el elemento Value de la siguiente manera: (anotar la fecha es ahora el cuarto, quinto no)

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

A continuación, se devuelven los dos eventos, pero si me voy hasta 20:01 y luego pierdo el todo el día evento. Cuando voy a las 20:01 también pierdo el evento de todo el día. ¿Alguien sabe dónde puedo encontrar una descripción detallada de este comportamiento?

EDIT2: Me confundí a mí mismo; corrigió la primera edición.

Respuesta

6

SharePoint almacena la fecha/hora en UTC (también conocido como GMT o Zulu) y cuando se visualiza primero la convierte en la zona horaria local del sitio.

Sin embargo, para los eventos de todo el día, almacena los horarios (00:00 a 23:59:00) en la zona horaria local del sitio.

Como ya ha descubierto usted mismo, creo que ha encontrado un error en la forma en que SharePoint interpreta la consulta y olvidando que los eventos de todo el día son hora local.

Creo que se puede hacer una solución desagradable esto haciendo una consulta para

EVENTDATE> = SomeDate O AllDayEvent = true y EVENTDATE> = SomeDate - 4 horas

Este cartel tiene problemas similares SO - SharePoint all day event gives obscure result

Y esto le dará una visión más clara de cómo el tiempo borked zonas están en SharePoint SharePoint Web Services and UTC time fun and games

Y si eso no es suficiente frustración para ti, entonces mira las fechas creadas/modificadas a través del modelo de objetos y maravíllate con cómo se informan como hora local para eventos normales y UTC para eventos de todo el día.

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

Adición de un valor Timespan como:

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

Esto debería solucionar el problema.

1

Al procesar los resultados de una consulta CAML, esto va a resolver el problema, pero no es lo 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(); 
     } 
} 

NOTA: esta revisión se supone que no está limitando la búsqueda a día. obviamente, en ese caso no ayudaría, a menos que haya expandido los parámetros de búsqueda para incluir un rango más amplio del que realmente necesita.

Sé que no es exactamente lo que busca el afiche, pero esto podría ayudar a otros que encuentren esta página ... no hay mucho documentado sobre este tema.

En concreto, esta corrección funcionará si realiza consultas por mes y solo muestra elementos de calendario que existen en ese mes. En este caso, CAML devolverá los últimos días del mes anterior y los primeros del mes siguiente de todos modos, por lo que no perderá los datos que se compensan por un día. (usando <Month />)

+0

Convert.ToBoolean (item ["fAllDayEvent"]) era exactamente lo que estaba buscando. ¡Gracias! –

0

Esto funcionó para mí.

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