Xquery 来比较数组中的日期值并获取最大日期值



在我的xquery中,我有条件检查数组中是否(SP_TYPE_CD!=")和(结束日期的最大值)并返回满足此条件的结束日期

请求:

`<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>

我的X查询:

for $SA_INFO_LISTRow in $StartServiceAllowedResponse/ns2:CMSService/ns2:CMSServiceDetails/ns2:SA_INFO_LIST/ns2:SA_INFO_LISTRow
    return
        if (($SA_INFO_LISTRow/@SP_TYPE_CD)and fn:max($SA_INFO_LISTRow/@EndDate))
        then <ns1:date>{(fn:data($SA_INFO_LISTRow/@EndDate)}</ns1:date>
        else ()

我在 jdeveloper 中运行 xquery 时收到错误消息

FORG0001: "2018-09-27": invalid value for cast/constructor: {http://www.w3.org/2001/XMLSchema}double: error: double: Invalid double value: 2018-09-27

除非你的查询是模式感知的,否则 @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不等于"的所有条目的最长结束日期,这将是(替换你的整个查询)

    <ns1:date>
      {max(//SA_INFO_LISTRow[@SP_TYPE_CD != '']/@EndDate/xs:date(.))}
    </ns1:date>

相关内容

  • 没有找到相关文章