Date Xquery比较数组中的日期值并获取最大日期值
在我的xquery中,我有一个条件来检查数组中的(SP_TYPE_CD!=“”)和(EndDate的最大值),并返回满足此条件的EndDate 请求:Date Xquery比较数组中的日期值并获取最大日期值,date,xslt,compare,xquery,Date,Xslt,Compare,Xquery,在我的xquery中,我有一个条件来检查数组中的(SP_TYPE_CD!=“”)和(EndDate的最大值),并返回满足此条件的EndDate 请求: `<CMS xmlns="*******************"> <CMSService> <CMSDetails AccountID="123456" CR="1000"> <SA_INFO_LIST>
`<CMS xmlns="*******************">
<CMSService>
<CMSDetails AccountID="123456" CR="1000">
<SA_INFO_LIST>
<SA_INFO_LISTRow SA_ID="3484598047" ServiceAgreementType="OOVRPAY" ServicePointType="" SP_TYPE_CD="" Status="60" StartDate="2018-09-27" EndDate="2018-09-27"/>
<SA_INFO_LISTRow SA_ID="3486640145" ServiceAgreementType="OOVRPAY" ServicePointType="" SP_TYPE_CD="" Status="60" StartDate="2018-04-26" EndDate="2018-04-26"/>
<SA_INFO_LISTRow SA_ID="3487463777" ServiceAgreementType="ERES" ServicePointType="3135182884" SP_TYPE_CD="RESE" Status="70" StartDate="2018-04-06" EndDate=""/>
<SA_INFO_LISTRow SA_ID="3482685560" ServiceAgreementType="OOVRPAY" ServicePointType="" SP_TYPE_CD="" Status="60"
</SA_INFO_LIST>
</CMSServiceDetails>
</CMSService>
</CMS>
除非查询支持模式,否则@endDate属性(原子化后)将是xs:untypedAtomic,max()函数将尝试将xs:untypedAtomic值转换为日期。您需要告诉查询处理器将这些值视为日期,您可以通过使查询模式感知或(更简单地说)通过显式转换来实现:
fn:max($SA_INFO_LISTRow/@EndDate/xs:date(.))
但是,您的查询还有其他问题。这种情况:
if (($SA_INFO_LISTRow/@SP_TYPE_CD) and fn:max($SA_INFO_LISTRow/@EndDate))
(更正后)只是询问是否存在一个最长日期,如果有任何日期,那么就会有一个最长日期,因此这是毫无意义的
另外,您说您正在查找@SP_TYPE_CD不等于“”的条目,但您的代码正在查找此属性存在的所有条目,而不管其值如何
我猜您实际上想要@SP_TYPE_CD不等于“”的所有条目的最大结束日期,这将是(替换整个查询)
{max(//SA_INFO_LISTRow[@SP_TYPE_CD!='']/@EndDate/xs:date(.))
谢谢你,迈克尔。我完全删除了if条件,并尝试了您提到的语句。但我收到错误消息第21行第74列:{}FORG0001:::强制转换/构造函数的值无效:{}日期:错误:日期:无效的日期值:错误类型:如果我更正了If语句和xquery:for$StartServiceAllowedResponse中的$SA_INFO_列表行/ns2:CMServiceAgreementByAccountSearchService/ns2:CMServiceAgreementByAccountSearchServiceDetails/ns2:SA_INFO_列表行返回If(($SA_INFO_列表行/@SP_type_CD)!=“”)和fn:max(xs:string($SA_INFO_LISTRow/@EndDate)))然后{max($SA_INFO_LISTRow[@SP_TYPE_CD!='')/@EndDate/xs:date(.)}else()。它会运行,但结果会返回所有日期,其中SP_TYPE_CD!=''。这不是最大日期。我使用的是xquery1.0,我没有注意到有些@EndDate值实际上不是日期。我不认为我可以给你更多的代码,除非你提供一个更精确的规范。
fn:max($SA_INFO_LISTRow/@EndDate/xs:date(.))
if (($SA_INFO_LISTRow/@SP_TYPE_CD) and fn:max($SA_INFO_LISTRow/@EndDate))
<ns1:date>
{max(//SA_INFO_LISTRow[@SP_TYPE_CD != '']/@EndDate/xs:date(.))}
</ns1:date>