前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CAML中比较日期时间类型

CAML中比较日期时间类型

作者头像
深蓝studyzy
发布2022-06-16 14:16:36
1.7K0
发布2022-06-16 14:16:36
举报
文章被收录于专栏:深蓝居

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-04-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档