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++.
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
Argumentos
x — Valor del que se obtiene el valor absoluto
Valor devuelto
El valor absoluto de x
Ejemplos
Ejemplo de uso
Introducido en: v25.11.0
Calcula y devuelve el valor medio de los argumentos proporcionados.
Admite tipos numéricos y temporales.
Sintaxis
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) │
└──────────┴───────────┘
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
Argumentos
Valor devuelto
Devuelve x con los bytes en orden inverso. (U)Int*
Ejemplos
Ejemplo de uso
SELECT byteSwap(3351772109)
8 bits
16 bits
32 bits
SELECT byteSwap(3351772109)
64 bits
SELECT byteSwap(123294967295)
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.
La división por 0 devuelve inf, -inf o nan.
Sintaxis
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)
División por cero
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.
Esta función es significativamente más lenta que divide.
Si realmente no necesita precisión controlada y/o necesita un cálculo rápido, considere usar divide.
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
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(toDecimal64(-12, 1), toDecimal32(2.1, 1), 1)─┬─divideDecimal(toDecimal64(-12, 1), toDecimal32(2.1, 1), 5)─┐
│ -12 │ 2.1 │ -5.7 │ -5.71428 │
└─────┴─────┴────────────────────────────────────────────────────────────┴────────────────────────────────────────────────────────────┘
Introducido en: v25.5.0
Igual que divide, pero devuelve NULL cuando se divide entre cero.
Sintaxis
Argumentos
x — Dividendo - y — Divisor
Valor devuelto
El cociente de x entre y, o NULL.
Ejemplos
División entre cero
SELECT divideOrNull(25, 0)
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
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
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
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)
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
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(intDiv(toFloat64(1), 0.001))─┐
│ 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)
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
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)
División del número negativo mínimo entre -1
SELECT intDivOrNull(-9223372036854775808, -1)
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
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)
Dividir el número negativo mínimo entre -1
SELECT intDivOrZero(0.05, -1)
Introducido en: v1.1.0
Devuelve 1 si el argumento Float32 o Float64 no es infinito ni es NaN;
de lo contrario, esta función devuelve 0.
Sintaxis
Argumentos
x — Número cuya finitud se comprueba. Float*
Valor devuelto
1 si x no es infinito ni NaN; en caso contrario, 0.
Ejemplos
Comprobar si un número es finito
Introducido en: v1.1.0
Devuelve 1 si el argumento de tipo Float32 o Float64 es infinito; en caso contrario, esta función devuelve 0.
Tenga en cuenta que también se devuelve 0 para un NaN.
Sintaxis
Argumentos
x — Número que se comprueba para determinar si es infinito. Float*
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))
Introducido en: v1.1.0
Devuelve 1 si el argumento de tipo Float32 o Float64 es NaN; de lo contrario, devuelve 0.
Sintaxis
Argumentos
x — Argumento que se evalúa para determinar si es NaN. Float*
Valor devuelto
1 si es NaN; de lo contrario, 0
Ejemplos
Ejemplo de uso
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
Argumentos
Valor devuelto
Devuelve el mínimo común múltiplo de x e y. (U)Int*
Ejemplos
Ejemplo de uso
Introducida en: v21.11.0
Devuelve el valor mayor de dos valores numéricos x e y.
Sintaxis
Argumentos
Valor devuelto
Devuelve el mayor de los valores x e y. Float64
Ejemplos
Ejemplo de uso
Introducido en: v25.11.0
Calcula y devuelve el valor medio de los argumentos proporcionados.
Admite tipos numéricos y temporales.
Sintaxis
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) │
└──────────┴───────────┘
Introducido en: v21.11.0
Devuelve el más pequeño de dos valores numéricos, x e y.
Sintaxis
Argumentos
Valor devuelto
Devuelve el menor valor entre x e y. Float64
Ejemplos
Ejemplo de uso
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
Argumentos
x — Minuendo. - y — Sustraendo.
Valor devuelto
x menos y
Ejemplos
Resta de dos números
Resta entre un entero y una fecha
SELECT minus(toDate('2025-01-01'),5)
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
Alias: mod
Argumentos
a — El dividendo - b — El divisor (módulo)
Valor devuelto
El resto de a % b
Ejemplos
Ejemplo de uso
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
Argumentos
Valor devuelto
Devuelve el resto de la división. (U)Int* o Float*
Ejemplos
Uso básico
SELECT moduloLegacy(10, 3)
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
si el argumento de la derecha es 0.
Sintaxis
Alias: modOrNull
Argumentos
Valor devuelto
Devuelve el resto de la división de x entre y, o NULL cuando el divisor es cero.
Ejemplos
moduloOrNull con cero
SELECT moduloOrNull(5, 0)
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
Argumentos
Valor devuelto
Devuelve el resto de a % b, o 0 si el divisor es 0.
Ejemplos
Ejemplo de uso
SELECT moduloOrZero(5, 0)
Introducido en: v1.1.0
Calcula el producto de dos valores x y y.
Sintaxis
Argumentos
Valor devuelto
Devuelve el producto de x e y
Ejemplos
Multiplicación de dos números
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.
Estas funciones son considerablemente más lentas que multiply.
Si realmente no necesita precisión controlada o necesita un cálculo rápido, considere usar multiply
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)
Diferencia con la multiplicación normal
SELECT multiplyDecimal(toDecimal256(-12, 0), toDecimal32(-2.1, 1), 1)
┌─multiply(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609633 │
└───────────────────────────────────────────────────────────┘
┌─multiplyDecimal(toDecimal64(-12.647, 3), toDecimal32(2.1239, 4))─┐
│ -26.8609 │
└──────────────────────────────────────────────────────────────────┘
Desbordamiento del tipo Decimal
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
multiplyDecimal(a, b);
SELECT
toDecimal64(-12.647987876, 9) AS a,
toDecimal64(123.967645643, 9) AS b,
a * b;
┌─────────────a─┬─────────────b─┬─multiplyDecimal(toDecimal64(-12.647987876, 9), toDecimal64(123.967645643, 9))─┐
│ -12.647987876 │ 123.967645643 │ -1567.941279108 │
└───────────────┴───────────────┴───────────────────────────────────────────────────────────────────────────────┘
Received exception from server (version 22.11.1):
Code: 407. DB::Exception: Received from localhost:9000. DB::Exception: Decimal math overflow:
While processing toDecimal64(-12.647987876, 9) AS a, toDecimal64(123.967645643, 9) AS b, a * b. (DECIMAL_OVERFLOW)
Introducido en: v1.1.0
Devuelve el valor negado del argumento x. El resultado siempre es con signo.
Sintaxis
Argumentos
x — El valor que se va a negar.
Valor devuelto
Devuelve -x de x
Ejemplos
Ejemplo de uso
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
Argumentos
x — operando izquierdo. - y — operando derecho.
Valor devuelto
Devuelve la suma de x e y
Ejemplos
Suma de dos números
Sumar un entero a una fecha
SELECT plus(toDate('2025-01-01'),5)
Agregar fecha y hora
SELECT toDate('2025-01-01') + CAST('14:30:25', 'Time')
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
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)
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
si el argumento de la derecha es 0.
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; null cuando el divisor es cero.
Ejemplos
positiveModuloOrNull
SELECT positiveModuloOrNull(5, 0)