Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Funciones aritméticas

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 = UInt32 o Float32 * 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 = UInt128 o Float32 * 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 = Int64 o UInt32 * 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.5

avg2

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:

  1. Convierta el entero en base 10 a su formato hexadecimal equivalente en orden big-endian; es decir, 3351772109 -> C7 C7 FB CD (4 bytes)
  2. Invierta los bytes; es decir, C7 C7 FB CD -> CD FB C7 C7
  3. 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

Valor devuelto

Devuelve x con los bytes en orden inverso. (U)Int*

Ejemplos

Ejemplo de uso

SELECT byteSwap(3351772109)
3455829959

8 bits

SELECT byteSwap(54)
54

16 bits

SELECT byteSwap(4135)
10000

32 bits

SELECT byteSwap(3351772109)
3455829959

64 bits

SELECT byteSwap(123294967295)
18439412204227788800

divide

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	Float64

División por cero

SELECT divide(25,0)
inf

divideDecimal

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)
\N

gcd

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

ifNotFinite

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

  • x — Valor que se comprueba para ver si es infinito. Float*
  • y — Valor alternativo. Float*

Valor devuelto

  • x si x es finito.
  • y si x no es finito.

Ejemplos

Ejemplo de uso

SELECT 1/0 AS infimum, ifNotFinite(infimum,42)
inf	42

intDiv

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)
\N

División del número negativo mínimo entre -1

SELECT intDivOrNull(-9223372036854775808, -1)
\N

intDivOrZero

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

Dividir el número negativo mínimo entre -1

SELECT intDivOrZero(0.05, -1)
0

isFinite

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

isInfinite

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

  • x — Número que se comprueba para determinar si es infinito. Float* o BFloat16

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	0

isNaN

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

  • x — Argumento que se evalúa para determinar si es NaN. Float* o BFloat16

Valor devuelto

1 si es NaN; de lo contrario, 0

Ejemplos

Ejemplo de uso

SELECT isNaN(NaN)
1

lcm

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

max2

Introducida en: v21.11.0

Devuelve el valor mayor de dos valores numéricos x e y.

Sintaxis

max2(x, y)

Argumentos

Valor devuelto

Devuelve el mayor de los valores x e y. Float64

Ejemplos

Ejemplo de uso

SELECT max2(-1, 2)
2

midpoint

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

Valor devuelto

Devuelve el menor valor entre x e y. Float64

Ejemplos

Ejemplo de uso

SELECT min2(-1, 2)
-1

minus

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

Resta entre un entero y una fecha

SELECT minus(toDate('2025-01-01'),5)
2024-12-27

modulo

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

moduloLegacy

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

moduloOrNull

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)
\N

moduloOrNull del entero negativo mínimo con -1

SELECT moduloOrNull(toInt8(-128), toInt8(-1))
\N

moduloOrZero

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

multiply

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

multiplyDecimal

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

  • a — Primer valor. Decimal
  • b — Segundo valor. Decimal
  • result_scale — Escala del resultado. (U)Int*

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.2

Diferencia 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)
-10

plus

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

Sumar un entero a una fecha

SELECT plus(toDate('2025-01-01'),5)
2025-01-06

Agregar fecha y hora

SELECT toDate('2025-01-01') + CAST('14:30:25', 'Time')
2025-01-01 14:30:25

positiveModulo

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

positiveModuloOrNull

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

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)
\N

positiveModuloOrNull del entero negativo mínimo dividido entre -1

SELECT positiveModuloOrNull(toInt8(-128), toInt8(-1))
\N

sqr

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
Navigation