Menu

Funciones numéricas en SQLite: ROUND, ABS, CEIL, FLOOR

Cómo hacer cálculos en SQLite con ROUND, ABS, CEIL, FLOOR, MOD, POWER, SQRT y RANDOM, y la trampa de la división entera que pilla a todo el mundo.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

SQLite tiene más matemáticas de las que crees

SQLite es famoso por ser minimalista, pero trae de fábrica un repertorio completo de funciones numéricas: redondeo, valor absoluto, techo y suelo, potencias, raíces, logaritmos, trigonometría y números aleatorios. La mayoría de estas funciones matemáticas se incorporaron en SQLite 3.35 (2021), así que cualquier instalación medianamente actual —la que viene con Python, con Node, la heredera de WebSQL en tu navegador o la CLI oficial— las tiene listas para usar.

Antes de entrar en materia, aquí va un adelanto rápido:

Seis funciones, una sola fila de resultados. En el resto de la página repasamos para qué sirve cada familia y los detalles que conviene tener en cuenta.

ROUND: la que más vas a usar

ROUND(valor, decimales) redondea a una cantidad concreta de posiciones decimales. El segundo argumento es opcional: si lo omites, se redondea al entero más cercano (aunque el resultado sigue siendo un valor en coma flotante):

Algunas cosas a tener en cuenta:

  • ROUND(3.14159) devuelve 3.0, no 3. Si quieres un entero, usa CAST(ROUND(x) AS INTEGER) o directamente CAST(x AS INTEGER) para truncar.
  • SQLite usa el redondeo "half away from zero" (la mitad se aleja del cero): 2.5 se redondea a 3 y -2.5 a -3. Algunas bases de datos aplican el redondeo bancario (half to even); SQLite no.
  • El argumento digits admite valores negativos: ROUND(1234.5, -2) redondea a la centena más cercana, devolviendo 1200.

En la práctica, lo que más vas a escribir es ROUND(price, 2) para mostrar importes monetarios.

ROUND vs CAST: no son lo mismo

Mucha gente recurre a CAST(x AS INTEGER) pensando que está redondeando, y se lleva una sorpresa:

CAST trunca hacia cero: simplemente descarta la parte decimal. ROUND, en cambio, redondea al entero más cercano. Para 2.9 la diferencia es de una unidad entera, así que elige el que realmente haga lo que necesitas.

ABS, SIGN y el signo de un número

ABS(x) devuelve el valor absoluto. SIGN(x) devuelve -1, 0 o 1 según el signo del número:

ABS es el caballo de batalla: te saca de apuros cuando necesitas saber «qué tan lejos están estos dos valores». SIGN se usa menos, pero viene de perlas cuando quieres agrupar filas por dirección (débito vs crédito, ganancia vs pérdida) sin tener que escribir un CASE explícito.

CEIL, FLOOR y TRUNC en SQLite

Estas funciones devuelven valores «enteros» sin redondear al más cercano. CEIL siempre redondea hacia arriba, FLOOR siempre hacia abajo, y TRUNC siempre hacia el cero:

Cuidado con los casos negativos. FLOOR(-2.9) da -3 (se aleja del cero), mientras que TRUNC(-2.9) da -2 (se acerca al cero). Cuando hay números negativos, FLOOR y TRUNC no coinciden, y elegir el equivocado es el típico bug off-by-one.

CEILING es un alias de CEIL. Usa la forma que te resulte más legible.

La división entera en SQLite: el verdadero tropiezo

Esto no es una función, sino el operador /, pero confunde a los principiantes más que cualquier otra función matemática de SQLite:

Cuando ambos lados son enteros, SQLite hace división entera y trunca el resultado. En el momento en que uno de los lados es REAL, toda la expresión pasa a ser real. La solución es asegurarte de que al menos uno de los operandos sea un número con decimales: o bien escribes 2.0 en lugar de 2, o usas un cast.

Esto te muerde sobre todo con referencias a columnas: total_cents / 100 devuelve un entero. total_cents / 100.0 devuelve el importe en dólares que realmente querías.

MOD y el operador %

MOD(x, y) devuelve el resto de x / y. El operador % hace exactamente lo mismo:

MOD(17, 5) y 17 % 5 devuelven ambos 2. El módulo por cero retorna NULL en SQLite — no lanza un error, lo cual resulta poco habitual comparado con la mayoría de los lenguajes. Si esto te importa, valida antes el divisor o envuelve la llamada en un CASE WHEN y = 0 THEN ... END.

La función y el operador son intercambiables. La mayoría tira de % porque es más corto.

POWER, SQRT, EXP y LOG en SQLite

Para potencias y raíces:

Algunos detalles que suelen pillar a la gente:

  • POW es un alias de POWER.
  • LOG(x) en SQLite usa base 10. LN(x) es el logaritmo natural. LOG(b, x) con dos argumentos es logaritmo en base b. (Esto se diferencia de muchos lenguajes donde log es el logaritmo natural; aquí ganó la convención de SQL.)
  • SQRT de un número negativo devuelve NULL, no lanza un error.
  • POWER(0, 0) devuelve 1 por convención.

Vienen muy bien para calcular intereses compuestos, normalizar a decibelios, medir distancias... cualquier cosa que involucre matemáticas geométricas o exponenciales.

RANDOM y RANDOMBLOB en SQLite

RANDOM() devuelve un entero con signo de 64 bits, dentro de todo su rango:

Para obtener un número dentro de un rango, envuélvelo con ABS (ya que RANDOM() devuelve valores con signo) y usa %. Si lo que quieres es un número real entre 0 y 1, divide entre el entero máximo de 64 bits. SQLite no trae un RAND() integrado que devuelva valores entre 0 y 1: te toca armarlo a mano.

RANDOMBLOB(n) devuelve n bytes aleatorios, algo muy útil para generar tokens de sesión o datos de prueba. Combínalo con HEX() y obtienes una cadena imprimible:

Cada llamada genera un valor nuevo. No esperes que RANDOM() devuelva el mismo número dos veces en la misma fila: incluso dentro de una sola expresión, cada invocación es independiente.

Juntándolo todo

Un pequeño ejemplo práctico: calcular distancias y redondear precios en una tabla de productos.

La clave está en price_cents / 100.0 — ese .0 convierte la división en real, y luego ROUND la deja con dos decimales. Sin él, 1299 / 100 te daría 12, no 12.99.

Lo que viene: fechas y horas

Las funciones numéricas se encargan de la parte matemática. Pero las fechas y horas merecen su propio set de herramientas: SQLite las guarda como texto, real o entero, y ofrece un puñado de funciones —pequeño pero potente— para parsearlas, darles formato y hacer aritmética con ellas. De eso hablamos a continuación.

Preguntas frecuentes

¿Cómo redondeo a 2 decimales en SQLite?

Usa ROUND(valor, 2). El segundo argumento indica cuántos decimales conservar, así que ROUND(3.14159, 2) devuelve 3.14. Ojo con la versión de un solo argumento: ROUND(x) redondea al entero más cercano, pero te devuelve un valor en coma flotante, cosa que suele sorprender.

¿SQLite tiene CEIL y FLOOR?

Sí. Desde SQLite 3.35 (año 2021) las funciones matemáticas vienen integradas: CEIL(x), FLOOR(x), SQRT(x), POWER(x, y), LOG(x), EXP(x) y compañía. En versiones anteriores no están disponibles a menos que cargues la extensión matemática, aunque la mayoría de instalaciones modernas (Python, Node, navegadores) ya las traen activadas.

¿Por qué 5 / 2 me devuelve 2 en SQLite?

Porque los dos operandos son enteros y SQLite hace división entera, truncando el resultado. Convierte uno de los lados a REAL —5 / 2.0 o CAST(5 AS REAL) / 2— y obtendrás 2.5. No es una rareza de las funciones numéricas: es el comportamiento normal del operador / cuando ambos argumentos son enteros.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR