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

目录
相关文章
|
20天前
|
关系型数据库 MySQL
日期和时间类型
日期和时间类型。
10 2
|
5月前
|
JSON JavaScript 前端开发
uniapp时间戳转换成年月日时分秒的格式
uniapp时间戳转换成年月日时分秒的格式
93 1
uniapp时间戳转换成年月日时分秒的格式
|
10月前
|
存储 关系型数据库 MySQL
列的类型定义——日期和时间类型
前言 日期与时间类型是为了方便在数据库中存储日期和时间而设计的,数据库有多种表示日期和时间的数据类型。其中,YEAR类型表示年,DATE类型表示日期,TIME类型表示时间,DATETIME和TIMESTAMP表示日期和时间。下面从这5种日期与时间类型的字节数、取值范围和零值等方面进行对比,如下表所示。
|
4月前
|
JavaScript 前端开发 API
vue3基础流程
vue3基础流程
33 0
timeval 转换为年月日
timeval 转换为年月日
127 0
timeval 转换为年月日
|
5月前
如何验证企业微信生成的token是否有效?
如何验证企业微信生成的token是否有效?
50 0
日期字符串转换成时间戳
日期字符串转换成时间戳
138 0
|
关系型数据库 MySQL
开发指南—数据类型—日期和时间类型
本文介绍了PolarDB-X支持的日期时间类型。
|
JavaScript Kotlin
时间戳转化为时分秒格式
时间戳转化为时分秒格式
338 0
|
关系型数据库 MySQL PHP
MySQL数据库(9):数据类型-时间日期类型
MySQL数据库(9):数据类型-时间日期类型
121 0
MySQL数据库(9):数据类型-时间日期类型