Funciones de fecha
En resumen: En SQLite las fechas son texto del tipo 2026-10-25, y date, strftime y julianday suman días, extraen el año o el mes y cuentan los días entre dos fechas.
Problema
¿Hasta cuándo puedo devolverlo?
Un cliente escribe: «¿Hasta cuándo puedo devolver mi pedido?» La tienda da 30 días desde la fecha del pedido. Hoy es 25 de octubre de 2026.
Contar días en un calendario es lento, y es fácil equivocarse a final de mes. Deja que lo haga la base.
La idea
Una fecha más días
En la tienda, las fechas son texto en la forma año-mes-día: 2026-10-25. Es el estándar internacional (ISO 8601). Por eso hasta ahora las fechas se han ordenado y comparado bien.
La función date(fecha, cambio) hace aritmética con fechas:
El pedido 54 se puede devolver hasta hoy, inclusive. Los cambios pueden ser días, meses y años, hacia delante o hacia atrás, y 'start of month' da el primer día del mes:
Más precisamente, para curiosos
Estas funciones son estrictas con la forma de la fecha. Sin el cero inicial (2026-9-30), date da NULL, y comparar como texto miente: '2026-10-25' va antes que '2026-9-30', porque «1» va antes que «9». Y '+1 month' desde el 31 de enero da el 31 de febrero, es decir, el 3 de marzo:
Así que guarda siempre las fechas con ceros iniciales, y ten cuidado al sumar meses a los últimos días de un mes.
Pruébalo
El plazo de pago
Los pedidos nuevos (new) deben pagarse dentro de los 3 días siguientes al pedido. Muestra el número, la fecha y el plazo en una columna llamada pay_until.
Solución
SELECT id, ordered_at, date(ordered_at, '+3 days') AS pay_until FROM orders WHERE status = 'new';date(ordered_at, '+3 days') AS pay_until. Aquí la comprobación también mira los nombres de las columnas.
La idea
Año, mes, día
strftime(formato, fecha) saca una parte de la fecha: '%Y' es el año, '%m' el mes, '%d' el día, '%w' el día de la semana (0 es domingo, 6 es sábado).
El resultado es texto, con cero inicial: el mes es 03, no 3.
Míralo
Registrados en marzo
Marketing quiere los clientes que se registraron en marzo, de cualquier año. Ejecuta:
Con la misma forma, texto con cero inicial, salen dos:
La idea
Cuántos días hay entre dos fechas
julianday(fecha) convierte la fecha en un número: cuántos días han pasado desde una fecha de inicio muy antigua. No necesitas el número en sí, pero la diferencia de dos de esos números es la cantidad de días entre las fechas.
Cuántos días llevan en la tienda los productos de cocina:
Más precisamente, para curiosos
En un informe real, en lugar de '2026-10-25' escribirás date('now') o CURRENT_DATE: la fecha de hoy. En SQLite las dos están en UTC, no en hora local, así que cerca de la medianoche tu fecha local y la de la base pueden diferir en un día. Las lecciones usan una fecha fija para que el resultado sea el mismo cada día.
Si la fecha lleva también hora (2026-10-25 18:20:00), datetime y time funcionan como date, y julianday da también una parte de día: 12 horas son 0.5.
Pruébalo
Pagados y esperando
Los pedidos pagados (paid) todavía no se han enviado. ¿Cuántos días lleva esperando cada uno al 25 de octubre de 2026? Muestra el número, la fecha y los días en una columna llamada waiting, el que más lleva esperando primero.
Solución
SELECT id, ordered_at, julianday('2026-10-25') - julianday(ordered_at) AS waiting
FROM orders
WHERE status = 'paid'
ORDER BY waiting DESC;julianday('2026-10-25') - julianday(ordered_at) AS waiting y ORDER BY waiting DESC. El pedido 9 espera desde octubre de 2025: alguien se olvidó de él. Aquí la comprobación también mira el orden.
Ejercicio
Dos tareas
1. El mensajero no trabaja los domingos. ¿Qué pedidos se hicieron en domingo? Muestra el número y la fecha.
Los pedidos hechos en domingo:
Solución
SELECT id, ordered_at FROM orders WHERE strftime('%w', ordered_at) = '0';WHERE strftime('%w', ordered_at) = '0'. Otra vez texto: '0' entre comillas. Siete pedidos.
2. ¿Qué pedidos entregados todavía se pueden devolver hoy, 25 de octubre de 2026? Muestra el número, la fecha y el plazo de devolución en una columna llamada return_until.
Los pedidos entregados que todavía se pueden devolver:
Solución
SELECT id, ordered_at, date(ordered_at, '+30 days') AS return_until
FROM orders
WHERE status = 'delivered' AND date(ordered_at, '+30 days') >= '2026-10-25';WHERE status = 'delivered' AND date(ordered_at, '+30 days') >= '2026-10-25'. Dos pedidos, el 54 y el 56. Para el 54 hoy es el último día, así que es >= y no >.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: SELECT: elegir columnas · WHERE: filtrar filas · ORDER BY, LIMIT y DISTINCT · Aritmética en una consulta
- Continúa en: GROUP BY: un informe por grupos · HAVING: una condición para los grupos · El orden de ejecución de una consulta · Árboles y secuencias: WITH RECURSIVE
- Ejercicios sobre el tema: Expresiones y funciones