🧚 ¡Oye! Beekeeper Studio es un GUI de bases de datos rápido, moderno y de código abierto Descarga
23 de agosto de 2024 Por Matthew Rathbone

Restar valores numéricos

Restar valores numéricos en SQL es muy sencillo. Se usa el operador - para la resta, igual que en otros lenguajes de programación.

Restar columnas de una tabla

Supongamos que tienes una tabla llamada sales que guarda las cifras de ventas reales y proyectadas:

CREATE TABLE sales (
    id INT PRIMARY KEY,
    actual_sales DECIMAL(10, 2),
    projected_sales DECIMAL(10, 2)
);

INSERT INTO sales (id, actual_sales, projected_sales)
VALUES
(1, 1000.00, 1200.00),
(2, 1500.00, 1500.00),
(3, 1300.00, 1250.00);

Para calcular la diferencia entre las ventas reales y las proyectadas, puedes escribir la siguiente consulta:

SELECT 
    id,
    actual_sales,
    projected_sales,
    actual_sales - projected_sales AS difference
FROM 
    sales;

Resultado esperado:

+----+--------------+-----------------+------------+
| id | actual_sales | projected_sales | difference |
+----+--------------+-----------------+------------+
|  1 |      1000.00 |         1200.00 |    -200.00 |
|  2 |      1500.00 |         1500.00 |       0.00 |
|  3 |      1300.00 |         1250.00 |      50.00 |
+----+--------------+-----------------+------------+
3 rows in set (0.00 sec)

Restar fechas en SQL

SQL también te permite restar fechas para obtener la diferencia en días, meses o años, según el sistema de base de datos que uses.

Restar fechas en MySQL

Considera una tabla employees con las columnas start_date y end_date:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    start_date DATE,
    end_date DATE
);

INSERT INTO employees (id, start_date, end_date)
VALUES
(1, '2023-01-01', '2023-08-01'),
(2, '2022-05-15', '2023-05-15'),
(3, '2023-03-01', '2023-03-31');

Para calcular la diferencia en días entre end_date y start_date, puedes usar la función DATEDIFF:

SELECT 
    id,
    start_date,
    end_date,
    DATEDIFF(end_date, start_date) AS days_difference
FROM 
    employees;

Resultado esperado:

+----+------------+------------+-----------------+
| id | start_date | end_date   | days_difference |
+----+------------+------------+-----------------+
|  1 | 2023-01-01 | 2023-08-01 |             212 |
|  2 | 2022-05-15 | 2023-05-15 |             365 |
|  3 | 2023-03-01 | 2023-03-31 |              30 |
+----+------------+------------+-----------------+
3 rows in set (0.01 sec)

Restar timestamps

Restar timestamps es útil cuando necesitas calcular diferencias de tiempo en segundos, minutos, horas, etc.

Restar timestamps en PostgreSQL

Supongamos que tienes una tabla logs que guarda los timestamps de cuándo empezó y terminó un evento:

CREATE TABLE logs (
    id SERIAL PRIMARY KEY,
    start_time TIMESTAMP,
    end_time TIMESTAMP
);

INSERT INTO logs (start_time, end_time)
VALUES
('2023-08-01 10:00:00', '2023-08-01 12:00:00'),
('2023-08-02 09:15:00', '2023-08-02 10:45:00');

Para calcular la diferencia en horas entre end_time y start_time, puedes usar la función EXTRACT:

SELECT 
    id,
    start_time,
    end_time,
    EXTRACT(EPOCH FROM end_time - start_time) / 3600 AS hours_difference
FROM 
    logs;

Resultado esperado:

id |     start_time      |      end_time       |  hours_difference
----+---------------------+---------------------+--------------------
  1 | 2023-08-01 10:00:00 | 2023-08-01 12:00:00 | 2.00
  2 | 2023-08-02 09:15:00 | 2023-08-02 10:45:00 | 1.50
(2 rows)

Time: 9.567 ms

Restar entre filas

En algunos casos, quizá quieras restar valores entre distintas filas. Esto suele hacerse con funciones de ventana.

Usemos una tabla monthly_sales para calcular la diferencia de ventas de un mes al siguiente:

CREATE TABLE monthly_sales (
    month DATE PRIMARY KEY,
    total_sales DECIMAL(10, 2)
);

INSERT INTO monthly_sales (month, total_sales)
VALUES
('2023-01-01', 2000.00),
('2023-02-01', 2200.00),
('2023-03-01', 2100.00);

Para calcular la diferencia de ventas mes a mes, puedes usar la función LAG:

SELECT 
    month,
    total_sales,
    total_sales - LAG(total_sales) OVER (ORDER BY month) AS sales_difference
FROM 
    monthly_sales;

Resultado esperado:

   month    | total_sales | sales_difference
------------+-------------+------------------
 2023-01-01 |     2000.00 |           [NULL]
 2023-02-01 |     2200.00 |           200.00
 2023-03-01 |     2100.00 |          -100.00
(3 rows)

Time: 5.648 ms

Conclusión

La resta en SQL es una operación versátil que puedes aplicar a números, fechas, timestamps e incluso entre filas. Aunque la sintaxis varía entre bases de datos SQL, la operación fundamental es la misma. La clave está en familiarizarte con estos matices.

Otros artículos que te pueden gustar:

Beekeeper Studio es un cliente de bases de datos gratuito y de código abierto

La mejor herramienta de consultas y edición de SQL que he usado. Tiene todo lo que necesito para administrar mi base de datos. - ⭐⭐⭐⭐⭐ Mit

Beekeeper Studio es rápido, intuitivo y fácil de usar. Es compatible con muchísimas bases de datos y funciona de maravilla en Windows, Mac y Linux.

La versión de Beekeeper para Linux tiene el 100% de las funciones, sin recortes ni concesiones.

Lo que dicen los usuarios de Beekeeper Studio

★★★★★
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos vuelva a ser divertido."
— Alex K., desarrollador de bases de datos
★★★★★
"He probado muchos GUI de bases de datos, pero Beekeeper logra el equilibrio perfecto entre funciones y simplicidad. Simplemente funciona."
— Sarah M., ingeniera Full Stack

¿Listo para mejorar tu flujo de trabajo con SQL?

download Descarga gratis