Descripción general
Las funciones aritméticas se aplican a cualquier par de operandos de tipo UInt8, UInt16, UInt32, UInt64, Int8, Int16, Int32, Int64, Float32 o Float64.
Antes de realizar la operación, ambos operandos se convierten al tipo de resultado. El tipo de resultado se determina de la siguiente manera (a menos que se especifique lo contrario en la documentación de la función que aparece a continuación):
- Si ambos operandos tienen hasta 32 bits, el tamaño del tipo de resultado será el del siguiente tipo de mayor tamaño después del mayor de los
dos operandos (promoción de tamaño de enteros). Por ejemplo,
UInt8 + UInt16 = UInt32oFloat32 * Float32 = Float64. - Si uno de los operandos tiene 64 bits o más, el tamaño del tipo de resultado será el mismo que el del mayor de los dos operandos. Por
ejemplo,
UInt32 + UInt128 = UInt128oFloat32 * Float64 = Float64. - Si uno de los operandos es con signo, el tipo de resultado también será con signo; en caso contrario, será sin signo. Por ejemplo,
UInt32 * Int32 = Int64oUInt32 * UInt32 = UInt64.
Estas reglas garantizan que el tipo de resultado será el tipo más pequeño capaz de representar todos los resultados posibles. Aunque esto introduce un riesgo de desbordamiento cerca de los límites del rango de valores, garantiza que los cálculos se realicen rápidamente utilizando el ancho nativo máximo de enteros de 64 bits. Este comportamiento también garantiza la compatibilidad con muchas otras bases de datos que ofrecen enteros de 64 bits (BIGINT) como el mayor tipo entero.
Ejemplo:
SELECT toTypeName(0), toTypeName(0 + 0), toTypeName(0 + 0 + 0), toTypeName(0 + 0 + 0 + 0)┌─toTypeName(0)─┬─toTypeName(plus(0, 0))─┬─toTypeName(plus(plus(0, 0), 0))─┬─toTypeName(plus(plus(plus(0, 0), 0), 0))─┐
│ UInt8 │ UInt16 │ UInt32 │ UInt64 │
└───────────────┴────────────────────────┴─────────────────────────────────┴──────────────────────────────────────────┘Los desbordamientos se producen de la misma forma que en C++.
abs
Introducido en: v1.1.0
Calcula el valor absoluto de x. No tiene efecto si x es de tipo sin signo. Si x es de tipo con signo, devuelve un número sin signo.
Sintaxis
abs(x)Argumentos
x— Valor del que se obtiene el valor absoluto
Valor devuelto
El valor absoluto de x
Ejemplos
Ejemplo de uso
SELECT abs(-0.5)0.5avg2
Introducido en: v25.11.0
Calcula y devuelve el valor medio de los argumentos proporcionados. Admite tipos numéricos y temporales.
Sintaxis
avg2(x1, x2])Argumentos
x1, x2]— Acepta dos valores para promediarlos.
Valor devuelto
Devuelve el valor medio de los argumentos proporcionados, expresado en el tipo compatible de mayor tamaño.
Ejemplos
Tipos numéricos
SELECT avg2(toUInt8(3), 1.0) AS result, toTypeName(result) AS type;
-- El tipo devuelto es Float64 ya que el UInt8 debe promoverse a 64 bits para la comparación.┌─result─┬─type────┐
│ 2 │ Float64 │
└────────┴─────────┘Tipos decimales
SELECT avg2(toDecimal32(1, 2), 2) AS result, toTypeName(result) AS type;┌─result─┬─type──────────┐
│ 1.5 │ Decimal(9, 2) │
└────────┴───────────────┘Tipos de dato Date
SELECT avg2(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘Tipos de DateTime
SELECT avg2(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘Tipos Time64
SELECT avg2(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘byteSwap
Introducido en: v23.10.0
Invierte los bytes de un entero, es decir, cambia su endianness.
El ejemplo siguiente puede desglosarse de la siguiente manera:
- Convierta el entero en base 10 a su formato hexadecimal equivalente en orden big-endian; es decir, 3351772109 -> C7 C7 FB CD (4 bytes)
- Invierta los bytes; es decir, C7 C7 FB CD -> CD FB C7 C7
- Convierta el resultado de nuevo en un entero asumiendo el orden big-endian; es decir, CD FB C7 C7 -> 3455829959 Un caso de uso de esta función es invertir direcciones IPv4:
┌─toIPv4(byteSwap(toUInt32(toIPv4('205.251.199.199'))))─┐
│ 199.199.251.205 │
└───────────────────────────────────────────────────────┘Sintaxis
byteSwap(x)Argumentos
x— Un valor entero.(U)Int*
Valor devuelto
Devuelve x con los bytes en orden inverso. (U)Int*
Ejemplos
Ejemplo de uso
SELECT byteSwap(3351772109)34558299598 bits
SELECT byteSwap(54)5416 bits
SELECT byteSwap(4135)1000032 bits
SELECT byteSwap(3351772109)345582995964 bits
SELECT byteSwap(123294967295)18439412204227788800divide
Introducido en: v1.1.0
Calcula el cociente de dos valores, a y b. El tipo de resultado siempre es Float64.
La función intDiv proporciona la división entera.
Sintaxis
divide(x, y)Argumentos
x— Dividendo -y— Divisor
Valor devuelto
El cociente de x entre y
Ejemplos
División de dos números
SELECT divide(25,5) AS quotient, toTypeName(quotient)5 Float64División por cero
SELECT divide(25,0)infdivideDecimal
Introducido en: v22.12.0
Realiza la división de dos números decimales. El valor resultante será de tipo Decimal256.
La escala del resultado puede especificarse explícitamente mediante el argumento result_scale (un Integer constante en el rango [0, 76]). Si no se especifica, la escala del resultado será la escala máxima de los argumentos proporcionados.
Sintaxis
divideDecimal(x, y[, result_scale])Argumentos
x— Primer valor: Decimal. -y— Segundo valor: Decimal. -result_scale— Escala del resultado. Tipo Int/UInt.
Valor devuelto
El resultado de la división con la escala especificada. Decimal256
Ejemplos
Ejemplo 1
SELECT divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)┌─divideDecimal(toDecimal256(-12, 0), toDecimal32(2.1, 1), 10)─┐
│ -5.7142857142 │
└──────────────────────────────────────────────────────────────┘Ejemplo 2
SELECT toDecimal64(-12, 1) / toDecimal32(2.1, 1);
SELECT toDecimal64(-12, 1) as a, toDecimal32(2.1, 1) as b, divideDecimal(a, b, 1), divideDecimal(a, b, 5);┌─divide(toDecimal64(-12, 1), toDecimal32(2.1, 1))─┐
│ -5.7 │
└──────────────────────────────────────────────────┘
┌───a─┬───b─┬─divideDecimal(a, b, 1)─┬─divideDecimal(a, b, 5)─┐
│ -12 │ 2.1 │ -5.7 │ -5.71428 │
└─────┴─────┴────────────────────────┴────────────────────────┘divideOrNull
Introducido en: v25.5.0
Igual que divide, pero devuelve NULL cuando se divide entre cero.
Sintaxis
divideOrNull(x, y)Argumentos
x— Dividendo -y— Divisor
Valor devuelto
El cociente de x entre y, o NULL.
Ejemplos
División entre cero
SELECT divideOrNull(25, 0)\Ngcd
Introducido en: v1.1.0
Devuelve el máximo común divisor de dos valores, a y b.
Se produce una excepción al dividir por cero o al dividir el número negativo mínimo entre menos uno.
Sintaxis
gcd(x, y)Argumentos
x— Primer número entero -y— Segundo número entero
Valor devuelto
El máximo común divisor de x y y.
Ejemplos
Ejemplo de uso
SELECT gcd(12, 18)6ifNotFinite
Introducido en: v20.3.0
Comprueba si un valor de punto flotante es finito.
Puede obtener un resultado similar utilizando el operador ternario: isFinite(x) ? x : y.
Sintaxis
ifNotFinite(x,y)Argumentos
Valor devuelto
xsixes finito.ysixno es finito.
Ejemplos
Ejemplo de uso
SELECT 1/0 AS infimum, ifNotFinite(infimum,42)inf 42intDiv
Introducido en: v1.1.0
Realiza una división entera de dos valores, x entre y. En otras palabras,
calcula el cociente redondeado hacia abajo al entero inferior más próximo.
El resultado tiene el mismo tamaño que el dividendo (el primer parámetro).
Se lanza una excepción al dividir por cero, cuando el cociente no cabe en el rango del dividendo o al dividir el número negativo mínimo entre menos uno.
Sintaxis
intDiv(x, y)Argumentos
x— Operando izquierdo. -y— Operando derecho.
Valor devuelto
Resultado de la división entera entre x e y
Ejemplos
División entera de dos números de punto flotante
SELECT intDiv(toFloat64(1), 0.001) AS res, toTypeName(res)┌──res─┬─toTypeName(res)─┐
│ 1000 │ Int64 │
└──────┴─────────────────┘El cociente no está dentro del rango del dividendo
SELECT
intDiv(1, 0.001) AS res,
toTypeName(res)Received exception from server (version 23.2.1):
Code: 153. DB::Exception: Received from localhost:9000. DB::Exception:
Cannot perform integer division, because it will produce infinite or too
large number: While processing intDiv(1, 0.001) AS res, toTypeName(res).
(ILLEGAL_DIVISION)intDivOrNull
Introducido en: v25.5.0
Igual que intDiv, pero devuelve NULL al dividir por cero o al dividir el
número negativo mínimo entre menos uno.
Sintaxis
intDivOrNull(x, y)Argumentos
Valor devuelto
Resultado de la división entera de x e y, o NULL.
Ejemplos
División entera entre cero
SELECT intDivOrNull(1, 0)\NDivisión del número negativo mínimo entre -1
SELECT intDivOrNull(-9223372036854775808, -1)\NintDivOrZero
Introducido en: v1.1.0
Igual que intDiv, pero devuelve cero al dividir por cero o al dividir el
número negativo mínimo entre menos uno.
Sintaxis
intDivOrZero(a, b)Argumentos
Valor devuelto
Resultado de la división entera de a entre b, o cero.
Ejemplos
División entera por cero
SELECT intDivOrZero(1, 0)0Dividir el número negativo mínimo entre -1
SELECT intDivOrZero(0.05, -1)0isFinite
Introducido en: v1.1.0
Devuelve 1 si el argumento Float32 o Float64, o BFloat16 no es infinito ni es NaN;
de lo contrario, esta función devuelve 0.
Sintaxis
isFinite(x)Argumentos
Valor devuelto
1 si x no es infinito ni NaN; en caso contrario, 0.
Ejemplos
Comprobar si un número es finito
SELECT isFinite(inf)0isInfinite
Introducido en: v1.1.0
Devuelve 1 si el argumento de tipo Float32 o Float64, o BFloat16 es infinito; en caso contrario, esta función devuelve 0.
Tenga en cuenta que también se devuelve 0 para un NaN.
Sintaxis
isInfinite(x)Argumentos
Valor devuelto
1 si x es infinito; de lo contrario, 0 (también para NaN).
Ejemplos
Comprobar si un número es infinito
SELECT isInfinite(inf), isInfinite(NaN), isInfinite(10)1 0 0isNaN
Introducido en: v1.1.0
Devuelve 1 si el argumento de tipo Float32 o Float64, o BFloat16, es NaN; de lo contrario, devuelve 0.
Sintaxis
isNaN(x)Argumentos
Valor devuelto
1 si es NaN; de lo contrario, 0
Ejemplos
Ejemplo de uso
SELECT isNaN(NaN)1lcm
Introducido en: v1.1.0
Devuelve el mínimo común múltiplo de dos valores x e y.
Se produce una excepción al dividir por cero o al dividir el número negativo mínimo entre menos uno.
Sintaxis
lcm(x, y)Argumentos
Valor devuelto
Devuelve el mínimo común múltiplo de x e y. (U)Int*
Ejemplos
Ejemplo de uso
SELECT lcm(6, 8)24max2
Introducida en: v21.11.0
Devuelve el valor mayor de dos valores numéricos x e y.
Sintaxis
max2(x, y)Argumentos
x— Primer valor(U)Int8/16/32/64oFloat*oBFloat16oDecimaly— Segundo valor(U)Int8/16/32/64oFloat*oBFloat16oDecimal
Valor devuelto
Devuelve el mayor de los valores x e y. Float64
Ejemplos
Ejemplo de uso
SELECT max2(-1, 2)2midpoint
Introducido en: v25.11.0
Calcula y devuelve el valor medio de los argumentos proporcionados. Admite tipos numéricos y temporales.
Sintaxis
midpoint(x1[, x2, ...])Argumentos
x1[, x2, ...]— Acepta un solo valor o varios para calcular el promedio.
Valor devuelto
Devuelve el valor medio de los argumentos proporcionados, convertido al tipo compatible de mayor tamaño.
Ejemplos
Tipos numéricos
SELECT midpoint(1, toUInt8(3), 0.5) AS result, toTypeName(result) AS type;
-- El tipo devuelto es Float64 ya que el UInt8 debe promoverse a 64 bits para la comparación.┌─result─┬─type────┐
│ 1.5 │ Float64 │
└────────┴─────────┘Tipos decimales
SELECT midpoint(toDecimal32(1.5, 2), toDecimal32(1, 1), 2) AS result, toTypeName(result) AS type;┌─result─┬─type──────────┐
│ 1.5 │ Decimal(9, 2) │
└────────┴───────────────┘Tipos de Date
SELECT midpoint(toDate('2025-01-01'), toDate('2025-01-05')) AS result, toTypeName(result) AS type;┌─────result─┬─type─┐
│ 2025-01-03 │ Date │
└────────────┴──────┘Tipos de DateTime
SELECT midpoint(toDateTime('2025-01-01 00:00:00'), toDateTime('2025-01-03 12:00:00')) AS result, toTypeName(result) AS type;┌──────────────result─┬─type─────┐
│ 2025-01-02 06:00:00 │ DateTime │
└─────────────────────┴──────────┘Tipos de Time64
SELECT midpoint(toTime64('12:00:00', 0), toTime64('14:00:00', 0)) AS result, toTypeName(result) AS type;┌───result─┬─type──────┐
│ 13:00:00 │ Time64(0) │
└──────────┴───────────┘min2
Introducido en: v21.11.0
Devuelve el más pequeño de dos valores numéricos, x e y.
Sintaxis
min2(x, y)Argumentos
x— Primer valor(U)Int8/16/32/64oFloat*oBFloat16oDecimaly— Segundo valor(U)Int8/16/32/64oFloat*oBFloat16oDecimal
Valor devuelto
Devuelve el menor valor entre x e y. Float64
Ejemplos
Ejemplo de uso
SELECT min2(-1, 2)-1minus
Introducido en: v1.1.0
Calcula la diferencia entre dos valores, a y b. El resultado siempre tiene signo.
Al igual que con plus, es posible restar un entero de una fecha o de una fecha con hora.
Además, se admite la resta entre fechas con hora, lo que da como resultado la diferencia de tiempo entre ambas.
Sintaxis
minus(x, y)Argumentos
x— Minuendo. -y— Sustraendo.
Valor devuelto
x menos y
Ejemplos
Resta de dos números
SELECT minus(10, 5)5Resta entre un entero y una fecha
SELECT minus(toDate('2025-01-01'),5)2024-12-27modulo
Introducido en: v1.1.0
Calcula el resto de la división de dos valores, a entre b.
El tipo de resultado es un entero si ambas entradas son enteras. Si una de las entradas es un número de coma flotante, el tipo de resultado es Float64.
El resto se calcula igual que en C++. Para los números negativos, se usa la división truncada.
Se genera una excepción al dividir por cero o al dividir el número negativo mínimo entre menos uno.
Sintaxis
modulo(a, b)Alias: mod
Argumentos
a— El dividendo -b— El divisor (módulo)
Valor devuelto
El resto de a % b
Ejemplos
Ejemplo de uso
SELECT modulo(5, 2)1moduloLegacy
Introducido en: v1.1.0
Calcula el resto de una división. Esta es la implementación heredada de módulo que usa el operador % de C++, que puede producir resultados negativos con argumentos negativos. Esta función existe por compatibilidad retroactiva con la lógica antigua de particionado de tablas. Utilice modulo o positiveModulo para el comportamiento estándar.
Sintaxis
moduloLegacy(a, b)Argumentos
Valor devuelto
Devuelve el resto de la división. (U)Int* o Float*
Ejemplos
Uso básico
SELECT moduloLegacy(10, 3)1moduloOrNull
Introducido en: v25.5.0
Calcula el resto de dividir a entre b. Es similar a la función modulo, excepto que moduloOrNull devuelve NULL
cuando, de otro modo, la operación produciría una excepción de coma flotante. En el caso de argumentos de coma flotante, esto ocurre solo cuando el
divisor es 0; para argumentos enteros, además cubre el caso del valor negativo mínimo módulo -1 (por ejemplo, -128 % -1 para Int8).
Sintaxis
moduloOrNull(x, y)Alias: modOrNull
Argumentos
Valor devuelto
Devuelve el resto de la división de x entre y, o NULL cuando la operación produciría una excepción de coma flotante:
cuando el divisor es cero o, en el caso de argumentos enteros, al calcular el valor negativo mínimo módulo -1.
Ejemplos
moduloOrNull con cero
SELECT moduloOrNull(5, 0)\NmoduloOrNull del entero negativo mínimo con -1
SELECT moduloOrNull(toInt8(-128), toInt8(-1))\NmoduloOrZero
Introducido en: v20.3.0
Como modulo, pero devuelve cero cuando el divisor es cero, en lugar de
generar una excepción con la función modulo.
Sintaxis
moduloOrZero(a, b)Argumentos
Valor devuelto
Devuelve el resto de a % b, o 0 si el divisor es 0.
Ejemplos
Ejemplo de uso
SELECT moduloOrZero(5, 0)0multiply
Introducido en: v1.1.0
Calcula el producto de dos valores x y y.
Sintaxis
multiply(x, y)Argumentos
Valor devuelto
Devuelve el producto de x e y
Ejemplos
Multiplicación de dos números
SELECT multiply(5,5)25multiplyDecimal
Introducido en: v22.12.0
Realiza la multiplicación de dos valores decimales. El valor resultante será de tipo Decimal256.
La escala del resultado puede especificarse explícitamente mediante el argumento result_scale (Integer constante en el rango [0, 76]). Si no se especifica, la escala del resultado será la escala máxima de los argumentos proporcionados.
Sintaxis
multiplyDecimal(a, b[, result_scale])Argumentos
Valor devuelto
El resultado de la multiplicación con la escala indicada. Tipo: Decimal256
Ejemplos
Ejemplo de uso
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)25.2Diferencia con la multiplicación normal
SELECT multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4));
SELECT multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4));┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609633 │
└───────────────────────────────────────────────────────────┘
┌─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609 │
└──────────────────────────────────────────────────────────────────┘Sin desbordamiento con multiplyDecimal
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
multiplyDecimal(a, b);┌─────────────a─┬─────────────b─┬─multiplyDecimal(a, b)─┐
│ -12.647987876 │ 123.967645643 │ -1567.941279108 │
└───────────────┴───────────────┴───────────────────────┘Desbordamiento del tipo Decimal con la multiplicación normal
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
a * b;Received exception:
Code: 407. DB::Exception: Decimal math overflow. (DECIMAL_OVERFLOW)negate
Introducido en: v1.1.0
Devuelve el valor negado del argumento x. El resultado siempre es con signo.
Sintaxis
negate(x)Argumentos
x— El valor que se va a negar.
Valor devuelto
Devuelve -x de x
Ejemplos
Ejemplo de uso
SELECT negate(10)-10plus
Introducido en: v1.1.0
Calcula la suma de dos valores x e y. Alias: x + y (operador).
Es posible sumar un entero y una fecha o una fecha con hora. La primera
operación aumenta el número de días de la fecha; la segunda
aumenta el número de segundos de la fecha con hora.
También es posible sumar una fecha y una hora. Sumar un Date y un Time
produce un DateTime. Sumar un Date y un Time64, o un Date32 y
un Time o Time64, produce un DateTime64.
Sintaxis
plus(x, y)Argumentos
x— operando izquierdo. -y— operando derecho.
Valor devuelto
Devuelve la suma de x e y
Ejemplos
Suma de dos números
SELECT plus(5,5)10Sumar un entero a una fecha
SELECT plus(toDate('2025-01-01'),5)2025-01-06Agregar fecha y hora
SELECT toDate('2025-01-01') + CAST('14:30:25', 'Time')2025-01-01 14:30:25positiveModulo
Introducido en: v22.11.0
Calcula el resto de dividir x entre y. Es similar a la función
modulo, salvo que positiveModulo siempre devuelve un número no negativo.
Sintaxis
positiveModulo(x, y)Alias: positive_modulo, pmod
Argumentos
Valor devuelto
Devuelve la diferencia entre x y el entero más cercano, no mayor que
x, que sea divisible por y.
Ejemplos
Ejemplo de uso
SELECT positiveModulo(-1, 10)9positiveModuloOrNull
Introducido en: v25.5.0
Calcula el resto de dividir a entre b. Es similar a la función positiveModulo, salvo que positiveModuloOrNull devuelve NULL
cuando la operación provocaría de otro modo una excepción de coma flotante. En el caso de argumentos de coma flotante, esto solo ocurre cuando el
divisor es 0; para argumentos enteros, además cubre el valor negativo mínimo módulo -1 (por ejemplo, -128 % -1 para Int8).
Sintaxis
positiveModuloOrNull(x, y)Alias: positive_modulo_or_null, pmodOrNull
Argumentos
x— El dividendo.(U)Int*/Float32/64. -y— El divisor (módulo).(U)Int*/Float32/64.
Valor devuelto
Devuelve la diferencia entre x y el entero más cercano, no mayor que
x, divisible por y, o NULL cuando la operación produciría una excepción de coma flotante: cuando el divisor es cero o,
para argumentos enteros, al calcular el valor negativo mínimo módulo -1.
Ejemplos
positiveModuloOrNull con cero
SELECT positiveModuloOrNull(5, 0)\NpositiveModuloOrNull del entero negativo mínimo dividido entre -1
SELECT positiveModuloOrNull(toInt8(-128), toInt8(-1))\Nsqr
Introducido en: v26.7.0
Calcula el cuadrado de un valor x.
Sintaxis
sqr(x)Argumentos
Valor devuelto
Devuelve el producto de x por sí mismo.
Ejemplos
Elevar al cuadrado un número
SELECT sqr(5)25