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,如需转载请自行联系原作者

相关文章
|
缓存 安全 Java
Spring高手之路21——深入剖析Spring AOP代理对象的创建
本文详细介绍了Spring AOP代理对象的创建过程,分为三个核心步骤:判断是否增强、匹配增强器和创建代理对象。通过源码分析和时序图展示,深入剖析了Spring AOP的工作原理,帮助读者全面理解Spring AOP代理对象的生成机制及其实现细节。
468 0
Spring高手之路21——深入剖析Spring AOP代理对象的创建
|
缓存 前端开发 JavaScript
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
Webpack 模块解析:打包原理、构造形式、扣代码补参数和全局导出
675 1
|
Go
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
【4月更文挑战第21天】Go语言函数是代码组织的基本单元,用于封装可重用逻辑。本文介绍了函数定义(包括基本形式、命名、参数列表和多返回值)、调用以及匿名函数与闭包。在函数定义时,注意参数命名和注释,避免参数顺序混淆。在调用时,要检查并处理多返回值中的错误。理解闭包原理,小心处理外部变量引用,以提升代码质量和可维护性。通过实践和示例,能更好地掌握Go语言函数。
384 1
Golang深入浅出之-Go语言函数基础:定义、调用与多返回值
|
开发框架 前端开发 .NET
Visual Studio中的四款代码格式化工具
Visual Studio中的四款代码格式化工具
677 0
|
编解码 缓存 安全
Android SELinux 参数语法介绍及基础分析
Android SELinux 参数语法介绍及基础分析
663 0
|
编解码 监控 算法
AVS3关键技术、性能和复杂度分析
本文由北京大学的范逵博士在LiveVideoStack线上分享第三季,第七期的内容整理而成,本次分享将主要从AVS3关键技术介绍、AVS3性能测试两个方面介绍AVS3基准档次中新采纳的编码工具,并分析这些编码工具的性能和计算复杂度。
2120 0
AVS3关键技术、性能和复杂度分析
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。