Xquery для сравнения значений даты в массиве и получения максимального значения даты - PullRequest
0 голосов
/ 28 января 2019

В моем xquery у меня есть условие, чтобы проверить, если (SP_TYPE_CD! = "") И (max of EndDate) в массиве и вернуть EndDate, которая удовлетворяет этому условию

Запрос:

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

Мой Xquery:

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 ()

Я получаю сообщение об ошибке при запуске xquery в jdeveloper

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

1 Ответ

0 голосов
/ 28 января 2019

Если ваш запрос не поддерживает схему, атрибут @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>
...