HOWTO · SQLite

Convertir fecha de cadena con formato en SQLite

Este tutorial discutirá cómo convertir la fecha de cadena con formato en SQLite.

En esta página

SQLite no tiene un tipo de almacenamiento específico para fechas. Las aplicaciones suelen guardar las fechas como texto, números de día juliano o marcas de tiempo Unix. Las funciones de fecha y hora de SQLite interpretan valores de tiempo admitidos; no reconocen automáticamente cualquier cadena que parezca una fecha. Para dar formato a una fecha en texto, asegúrate primero de que use una forma de entrada que SQLite reconozca y, después, elige el patrón de salida que necesites.

Los ejemplos siguientes usan SQL de SQLite. strftime() da formato de texto a un valor de tiempo reconocido; no cambia de forma permanente el valor almacenado en una tabla. Si tus datos de origen usan una disposición personalizada, como MM-DD-YYYY, conviértela explícitamente antes de hacer comparaciones o cálculos con fechas.

Cómo interpreta SQLite los valores de fecha y hora

Las funciones de fecha y hora de SQLite aceptan valores de tiempo admitidos, incluidas formas de texto ISO 8601 habituales, números de día juliano y marcas de tiempo Unix cuando se usan con el modificador adecuado. Una columna de texto puede contener cualquier carácter, así que guardar un valor en una columna llamada event_date no garantiza que SQLite pueda interpretarlo. Si controlas la fuente de datos, mantén una convención de entrada uniforme.

El formato y el análisis están relacionados, pero son operaciones distintas. strftime() recibe una cadena de formato seguida de un valor de tiempo y devuelve texto con ese formato cuando puede interpretar el valor. Si no puede hacerlo, el resultado es NULL. Conviene comprobar explícitamente ese resultado en lugar de dar por hecho que se convirtió cada fila.

Dar formato a una fecha admitida con strftime()

Usa como entrada una fecha ISO admitida y como patrón de salida %Y-%m-%d. %Y representa un año de cuatro dígitos, %m un mes de dos dígitos y %d un día de dos dígitos. El patrón de salida también determina la puntuación; por eso este ejemplo usa guiones en todo momento.

Ejecuta este ejemplo autónomo de Python. Envía la consulta SQL a SQLite e imprime el valor devuelto.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import sqlite3

connection = sqlite3.connect(":memory:")
value = connection.execute(
    "SELECT strftime('%Y-%m-%d', '2022-12-31')"
).fetchone()[0]
print(value)
connection.close()
2022-12-31

La expresión SQL equivalente es SELECT strftime('%Y-%m-%d', '2022-12-31');. En una consulta, el resultado es texto, lo que resulta práctico para mostrarlo y exportarlo. Para comparar fechas cronológicamente, usa una representación uniforme y ordenable, como YYYY-MM-DD, o compara los valores mediante las funciones de fecha y hora de SQLite en vez de mezclar disposiciones de texto distintas.

Dar formato a valores de fecha almacenados en una tabla

Aplica la misma función a una columna si sus valores usan una forma de entrada admitida. Supongamos que events contiene la fila de entrada event_date = '2022-12-31'. Esta consulta de SQLite le da formato de día/mes/año: SELECT event_date, strftime('%d/%m/%Y', event_date) AS formatted_date FROM events;. La fila de resultado correspondiente es 2022-12-31 | 31/12/2022. La consulta devuelve un valor con formato por cada fila; no modifica la columna almacenada. Usa UPDATE solo cuando quieras reemplazar los datos almacenados y, antes de hacerlo, guarda una copia de seguridad.

La suposición sobre la entrada es importante. Si una fila contiene otra disposición o texto que no corresponde a una fecha, el resultado del formato puede ser NULL. Al depurar los datos, selecciona tanto la columna original como el resultado con formato para identificar los valores que necesitan un tratamiento aparte antes de modificarlos o exportarlos.

Manejar con seguridad varios formatos de entrada

Si una columna contiene valores en más de una disposición, identifica cada formato a partir de una regla fiable, como el tipo de importación o una columna source_format independiente. No deduzcas la convención de fecha solo por la presencia de una barra o un guion: 03/04/2024 podría significar el 4 de marzo o el 3 de abril. Cambiar los separadores tampoco reordena el mes, el día y el año.

Si la regla de origen identifica una fila como MM-DD-YYYY, SQLite puede reorganizar sus partes para crear una fecha ISO admitida antes de darle formato. Por ejemplo, para event_date = '12-31-2022' y source_format = 'MM-DD-YYYY', usa CASE WHEN source_format = 'MM-DD-YYYY' THEN strftime('%Y-%m-%d', substr(event_date, 7, 4) || '-' || substr(event_date, 1, 2) || '-' || substr(event_date, 4, 2)) WHEN source_format = 'YYYY-MM-DD' THEN strftime('%Y-%m-%d', event_date) ELSE NULL END AS normalized_date. La primera rama devuelve 2022-12-31; si una fila tiene un source_format desconocido, devuelve NULL en vez de presentarla como convertida. Comprobar la forma del texto puede ayudar a dirigir las filas, pero que coincidan las posiciones de los caracteres no demuestra que el mes y el día formen una fecha válida del calendario. Valida las fechas por separado al importar valores que no sean de confianza.

Comprobar los resultados y tratar los valores no reconocidos

Comprueba si el valor devuelto es NULL y conserva el valor de origen mientras investigas. Un resultado NULL significa que la función de fecha no produjo un valor con formato; no es una fecha sustituta y no debe tratarse silenciosamente como tal. Comprueba los espacios en blanco, el orden exacto del año, el mes y el día, y si la marca de tiempo incluye un sufijo que tu conversión no contempla.

Si los valores proceden de una fuente externa, normalízalos al importarlos y registra el formato de origen utilizado. Si no puedes determinar con seguridad el formato de una fila, déjala pendiente para depurar los datos en vez de adivinar. strftime() también sirve para patrones de visualización distintos del orden ISO, pero cambiar el patrón de salida solo modifica el texto devuelto, no la representación almacenada. Estos ejemplos se centran en SQLite; otros motores de bases de datos usan funciones de fecha y reglas de análisis diferentes.