我正在为SharePoint(Schema.xml)中的事件列表编写视图,我想根据DateTime过滤结果(即仅显示在2个日期之间开始的事件)
通常情况下,我会像这样使用CAML查询:
<Where>
<And>
<Geq>
<FieldRef Name="Event_x0020_Start_x0020_Date" />
<Value Type=”DateTime”>2009-10-10T10:00:00Z</Value>
</Geq>
<Leq>
<FieldRef Name="Event_x0020_Start_x0020_Date" />
<Value Type=”DateTime”>2009-11-10T10:00:00Z</Value>
</Leq>
</And>
</Where>
但是,在这种情况下,我要比较的日期不能直接在字段中使用,我必须从查询字符串中获取它们。
我尝试使用
<Value Type="DateTime">
<GetVar Scope="Request" Name="Start" />
</Value>
<Value Type="DateTime">
<GetVar Scope="Request" Name="End" />
</Value>
其中Start和End是查询字符串中的2个日期(我尝试了每种日期格式,有和没有Type =“DateTime”)但我总是得到空结果。当我对日期进行硬编码时(例如2009-10-10T10:00:00Z),查询工作正常。
我可以控制我在查询字符串中发送的内容,因此如果有其他方法,我可以更改它。
那么有没有办法在查询字符串中获取DateTime格式?如果没有,我还有其他选择吗?
谢谢!
答案 0 :(得分:3)
您是否尝试过添加自定义页面,然后向其添加DataFormWebPart(DFWP)?这反过来允许您在DFWP使用的SPDatasource的SelectCommand中对您的CAMl查询进行整形,使用实际的ASP.NET日历控件作为参数,在SPDataSource的参数中指定。在spdatasource的参数绑定中使用Control(ID,PROPERTYTOUSEINCAML)。
即:
<ParameterBinding Name="StartDate" Location="Control(calStart, SelectedDate)" DefaultValue="01-01-2009"/>
<ParameterBinding Name="EndDate" Location="Control(calEnd, SelectedDate)" DefaultValue="01-01-2009"/>
然后让SelectCommand的CAML类似于:
<Where>
<And>
<Geq>
<FieldRef Name="Event_x0020_Start_x0020_Date" />
<Value Type=”DateTime”>{StartDateParameter}</Value>
</Geq>
<Leq>
<FieldRef Name="Event_x0020_Start_x0020_Date" />
<Value Type=”DateTime”>{EndDateParameter}</Value>
</Leq>
</And>
</Where>
答案 1 :(得分:0)
首先,CAML的一个常见错误是不使用字段的内部名称...尝试使用
list.Fields["Display Name"].InternalName
其次,使用SPUtility的日期实用程序
Microsoft.SharePoint.Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(System.DateTime.Now)
答案 2 :(得分:-1)
查询字符串中的正确日期格式为yyyy-mm-dd,请参阅this post