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子句

本文转自深蓝居博客园博客,原文链接:http://www.cnblogs.com/studyzy/archive/2009/04/09/1432557.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Java
如何将OffsetDateTime转换为字符串格式的日期
【10月更文挑战第30天】如何将OffsetDateTime转换为字符串格式的日期
66 0
|
5月前
2020-04-18T16:51:56+08:00 类型的时间格式化处理
2020-04-18T16:51:56+08:00 类型的时间格式化处理
27 0
|
6月前
|
SQL 关系型数据库 MySQL
【Databand】日期时间函数
【Databand】日期时间函数
71 1
|
7月前
|
关系型数据库 MySQL
日期和时间类型
日期和时间类型。
65 2
|
存储 关系型数据库 MySQL
列的类型定义——日期和时间类型
前言 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型。其中,YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间。下面从这5种日期与时间类型的字节数、取值范围和零值等方面进行对比,如下表所示。
timeval 转换为年月日
timeval 转换为年月日
177 0
timeval 转换为年月日
|
7月前
|
前端开发 Java
关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换
关于时间格式yyyy-M-d或yyyy-MM-d到yyyy-MM-dd的转换
510 0
|
关系型数据库 MySQL PHP
MySQL数据库(9):数据类型-时间日期类型
MySQL数据库(9):数据类型-时间日期类型
153 0
MySQL数据库(9):数据类型-时间日期类型
日期字符串转换成时间戳
日期字符串转换成时间戳
185 0