Expresiones aritméticas

Las expresiones aritméticas realizan operaciones que implican suma, resta, multiplicación, división y módulo.

la tabla siguiente describe los operadores aritméticos y los lista por orden de prioridad de operador, de más alta a más baja. Los operadores unarios tienen una prioridad mayor que los operadores binarios, a menos que se utilicen paréntesis para forzar la evaluación del operador binario.
Tabla 1. Operadores aritméticos en XQuery
Operador Finalidad Asociatividad
-(unary), +(unary) niega el valor del operando, mantiene el valor del operando derecha a izquierda
*, div, idiv, mod multiplicación, división, división entera, módulo izquierda a derecha
+, - adición, resta izquierda a derecha
Nota: Un operador de resta debe ir precedido de un espacio en blanco si el operador podría interpretarse como parte de una señal anterior. Por ejemplo, a-b se interpreta como un nombre, pero a - b y a -b se interpretan como operaciones aritméticas.
El resultado de una expresión aritmética es un valor numérico, una secuencia vacía o un error. Cuando se evalúa una expresión aritmética, cada operando se atomiza (se convierte en un valor atómico) y se aplican las reglas siguientes:
  • Si el operando atomizado es una secuencia vacía, el resultado de la expresión aritmética es una secuencia vacía.
  • Si el operando atomizado es una secuencia que contiene más de un valor, se devuelve un error.
  • Si el operando atomizado es un valor atómico no tipado xdt:untypedAtomic ), el valor se convierte a xs:double. Si la conversión falla, se devuelve un error.
Si los tipos de los operandos, después de la evaluación, son una combinación válida para el operador aritmético, el operador se aplica a los operandos atomizados, y el resultado de esta operación es un valor atómico o un error (por ejemplo, un error puede ser el resultado de dividir por cero.) Si los tipos de los operandos no son una combinación válida para el operador aritmético, se devuelve un error.
La Tabla 2 identifica combinaciones válidas de tipos para operadores aritméticos. En esta tabla, la letra A representa el primer operando de la expresión y la letra B representa el segundo operando. El término numérico indica los tipos xs:integer, xs:decimal, xs:float, xs:double o cualquier tipo derivado de uno de estos tipos. Si el tipo de resultado de un operador se lista como numérico, el tipo de resultado será el primer tipo de la lista ordenada (xs: integer, xs:decimal, xs:float, xs:double) en la que se pueden convertir todos los operandos por sustitución de subtipo y promoción de tipo.
Tabla 2. Tipos válidos para operandos de expresiones aritméticas
Operador con operandos Tipo de operando A Tipo de operando B Tipo de resultado
A + B numéricos numéricos numéricos
A + B xs:date xdt:yearMonthDuration xs:date
A + B xdt:yearMonthDuration xs:date xs:date
A + B xs:date xdt:dayTimeDuration xs:date
A + B xdt:dayTimeDuration xs:date xs:date
A + B xs:time xdt:dayTimeDuration xs:time
A + B xdt:dayTimeDuration xs:time xs:time
A + B xs:dateTime xdt:yearMonthDuration xs:dateTime
A + B xdt:yearMonthDuration xs:dateTime xs:dateTime
A + B xs:dateTime xdt:dayTimeDuration xs:dateTime
A + B xdt:dayTimeDuration xs:dateTime xs:dateTime
A + B xdt:yearMonthDuration xdt:yearMonthDuration xdt:yearMonthDuration
A + B xdt:dayTimeDuration xdt:dayTimeDuration xdt:dayTimeDuration
A-B numéricos numéricos numéricos
A-B xs:date xs:date xdt:dayTimeDuration
A-B xs:date xdt:yearMonthDuration xs:date
A-B xs:date xdt:dayTimeDuration xs:date
A-B xs:time xs:time xdt:dayTimeDuration
A-B xs:time xdt:dayTimeDuration xs:time
A-B xs:dateTime xs:dateTime xdt:dayTimeDuration
A-B xs:dateTime xdt:yearMonthDuration xs:dateTime
A-B xs:dateTime xdt:dayTimeDuration xs:dateTime
A-B xdt:yearMonthDuration xdt:yearMonthDuration xdt:yearMonthDuration
A-B xdt:dayTimeDuration xdt:dayTimeDuration xdt:dayTimeDuration
A * B numéricos numéricos numéricos
A * B xdt:yearMonthDuration numéricos xdt:yearMonthDuration
A * B numéricos xdt:yearMonthDuration xdt:yearMonthDuration
A * B xdt:dayTimeDuration numéricos xdt:dayTimeDuration
A * B numéricos xdt:dayTimeDuration xdt:dayTimeDuration
A idiv B numéricos numéricos xs:integer
A div B numéricos numéricos numérico; pero xs:decimal si ambos operandos son xs:integer
A div B xdt:yearMonthDuration numéricos xdt:yearMonthDuration
A div B xdt:dayTimeDuration numéricos xdt:dayTimeDuration
A div B xdt:yearMonthDuration xdt:yearMonthDuration xs:decimal
A div B xdt:dayTimeDuration xdt:dayTimeDuration xs:decimal
A mod B numéricos numéricos numéricos

ejemplos

  • En el siguiente ejemplo, la primera expresión devuelve el valor xs:decimal -1.5, y la segunda expresión devuelve el valor xs:integer -1 :
    -3 div 2
    -3 idiv 2
    
  • En la siguiente expresión, la resta de dos valores de fecha da como resultado un valor de tipo xdt:dayTimeDuration:
    $emp/hiredate - $emp/birthdate
  • El ejemplo siguiente ilustra la diferencia entre un operador de resta y guiones que se utilizan en los nombres de variable unit-price y unit-discount:
    $unit-price - $unit-discount