zoukankan      html  css  js  c++  java
  • CAML中比较日期时间类型

    在做Sharepoint的列表查询的时候,经常要用到CAML,今天我在做一个工作流授权列表的查询,里面要求根据人员、工作流名称、授权开始时间和授权结束时间找到对应的授权人,没有找到就返回本人。使用CAML QueryBuilder生成了查询,然后修改了其中的对应的变量,进行查询。结果发现查询结果有问题。原来是在CAML中使用的日期类型的表示必须是一种国内很少用的特殊的格式,,形如"2009-04-09T15:11:20Z"网上找了一下,使用SPUtility.CreateISO8601DateTimeFromSystemDateTime

    这个函数就可以生成这种格式,当然,其实是有Datetime.ToString(“格式”)也是可以的。查询的CAML是这样的:

    string dString = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now);
                q.Query =
                       @"<Where>
          <And>
             <And>
                <And>
                   <Contains>
                      <FieldRef Name='_x5de5__x4f5c__x6d41_' />
                      <Value Type='LookupMulti'>" + wfName + @"</Value>
                   </Contains>
                   <Eq>
                      <FieldRef Name='Author' LookupId='TRUE'/>
                      <Value Type='User'>" + us.ID + @"</Value>
                   </Eq>
                </And>
                <Lt>
                   <FieldRef Name='_x5f00__x59cb__x65f6__x95f4_'/>
                   <Value Type='DateTime'>" + dString + @"</Value>
                </Lt>
             </And>
             <Gt>
                <FieldRef Name='_x7ed3__x675f__x65f6__x95f4_'/>
                <Value Type='DateTime'>" + dString + @"</Value>
             </Gt>
          </And>
       </Where>";

    这样做以后进行查询,大部分情况都对了,但是有时候还是会不对,那就是在当天的时候。比如我设置了开始时间是2009-4-9 10:00:00,而现在的时间是9号的14点,但是查询却没有返回结果,经过多次试验,终于找到原因,原来是根本没有对时间字段进行比较,而只是对日期进行比较,由于4月9号并不大于4月9号,所以就找不到结果。

    要进行时间字段的比较,那么需要在CAML中的Value字段上添加IncludeTimeValue='TRUE',添加后就可以进行时间字段的比较了。

    string dString = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now);
                q.Query =
                       @"<Where>
          <And>
             <And>
                <And>
                   <Contains>
                      <FieldRef Name='_x5de5__x4f5c__x6d41_' />
                      <Value Type='LookupMulti'>" + wfName + @"</Value>
                   </Contains>
                   <Eq>
                      <FieldRef Name='Author' LookupId='TRUE'/>
                      <Value Type='User'>" + us.ID + @"</Value>
                   </Eq>
                </And>
                <Lt>
                   <FieldRef Name='_x5f00__x59cb__x65f6__x95f4_'/>
                   <Value Type='DateTime' IncludeTimeValue='TRUE'>" + dString + @"</Value>
                </Lt>
             </And>
             <Gt>
                <FieldRef Name='_x7ed3__x675f__x65f6__x95f4_'/>
                <Value Type='DateTime' IncludeTimeValue='TRUE'>" + dString + @"</Value>
             </Gt>
          </And>
       </Where>";

    这里我写的时候,犯了个错,把IncludeTimeValue='TRUE'写到FieldRef中去了,以为就跟LookupId='TRUE'一样,结果老是查询不比较时间字段,这里大家也要注意啊。

    另外,再附上一个CAML语法:

    CAML语法-Query写法

    元素 说明
    And 并且
    BeginsWith 以某字符串开始的
    Contains 包含某字符串
    Eq 等于
    FieldRef 一个字段的引用 (在GroupBy 中使用)
    Geq 大于等于
    GroupBy 分组
    Gt 大于
    IsNotNull 非空
    IsNull 空
    Leq 小于等于
    Lt 小于
    Neq 不等于
    Now 当前时间
    Or 或
    OrderBy 排序
    Today 今天的日期
    TodayIso 今天的日期(ISO格式)
    Where Where子句

    【本文章出自博客园深蓝居,转载请注明作者出处,如果您觉得博主的文章对您有很大帮助,欢迎支付宝(studyzy@163.com)对博主进行打赏。】
  • 相关阅读:
    JS数组的相关方法
    JS字符串的相关方法
    重回我的园区
    STM32F405串口UART4波特率注意问题
    NXP MCU开始学习中
    锂电池测试
    FPGA与STM32并口通信
    NXP LPC4350绝对强悍,准备入手学习
    SDRAM+FPGA+MCU
    STM32+FPGA通信成功
  • 原文地址:https://www.cnblogs.com/studyzy/p/1432557.html
Copyright © 2011-2022 走看看