SQL Snippets

Fragmentos de timestamp Unix en SQL

Ejemplos de SQL para trabajar con timestamps Unix en MySQL, PostgreSQL y SQLite, incluyendo valores epoch actuales, conversión a fechas y conversión de vuelta a timestamps.

MySQL — current timestamp
-- Seconds
UNIX_TIMESTAMP()

-- Milliseconds (MySQL 8.0+)
ROUND(UNIX_TIMESTAMP(NOW(3)) * 1000)
MySQL — timestamp to datetime
FROM_UNIXTIME(1700000000)
FROM_UNIXTIME(1700000000, '%Y-%m-%d %H:%i:%S')
MySQL — datetime to timestamp
UNIX_TIMESTAMP('2023-11-15 06:13:20')
PostgreSQL — current timestamp
-- Seconds (integer)
EXTRACT(EPOCH FROM NOW())::BIGINT

-- Milliseconds
ROUND(EXTRACT(EPOCH FROM NOW()) * 1000)::BIGINT
PostgreSQL — timestamp to timestamptz
TO_TIMESTAMP(1700000000)
TO_TIMESTAMP(1700000000) AT TIME ZONE 'America/New_York'
PostgreSQL — datetime to epoch
EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2023-11-15T06:13:20Z')::BIGINT
SQLite — current timestamp
strftime('%s', 'now')  -- seconds
SQLite — timestamp to datetime
datetime(1700000000, 'unixepoch')
datetime(1700000000, 'unixepoch', 'localtime')

Conceptos básicos de marcas de tiempo en SQL

Cada base de datos expone ayudantes de marca de tiempo Unix con nombres ligeramente distintos. MySQL usa UNIX_TIMESTAMP(), PostgreSQL puede extraer segundos epoch de now() y SQLite suele usar strftime('%s', 'now').

Notas de conversión en bases de datos

Almacena las marcas de tiempo como enteros cuando necesites comparaciones numéricas rápidas, o usa tipos de marca de tiempo nativos cuando necesites funciones de zona horaria y fecha a nivel de base de datos. Sé explícito sobre UTC en los límites de importación y exportación.

Notas de producción para SQL

La elección de la marca de tiempo de la base de datos debe coincidir con cómo se consultará el valor. Los segundos Unix enteros son simples para ventanas de registros y escaneos de rango. Los tipos de marca de tiempo nativos son mejores cuando la base de datos debe agrupar por día de calendario, truncar a mes o aplicar funciones con zona horaria. Evita mezclar ambas representaciones sin una regla de conversión clara.

  • Usa BIGINT en lugar de INT al almacenar marcas de tiempo en milisegundos
  • Usa UTC para las marcas de tiempo importadas para que los servidores de aplicación coincidan en los límites
  • Usa rangos semiabiertos como created_at >= start and created_at < end
  • Indexa exactamente la columna usada en los filtros de rango, ya sean segundos epoch o un tipo timestamp

Conversión de datetime en SQL: GETDATE, CONVERT, CAST

Los usuarios de SQL Server que buscan «datetime convert in sql», «getdate sql», «sql conversion date», «sql getdate date» o «convert date timestamp to date» suelen querer los ayudantes de T-SQL GETDATE(), CONVERT() y CAST(). MySQL y PostgreSQL usan otros built-ins, pero la operación es la misma: convertir un entero Unix en un datetime, o un datetime en el entero Unix correspondiente.

  • SQL Server GETDATE() — datetime actual en la zona local del servidor; usa SYSUTCDATETIME() para UTC
  • SQL Server epoch → datetime: DATEADD(SECOND, 1700000000, '1970-01-01T00:00:00')
  • SQL Server datetime → epoch: DATEDIFF_BIG(SECOND, '1970-01-01', GETUTCDATE())
  • SQL Server CONVERT/CAST date↔datetime: CONVERT(date, GETDATE()) elimina la hora; CAST('2024-03-15T14:30:00' AS datetime2) analiza ISO 8601
  • MySQL: SELECT UNIX_TIMESTAMP(NOW()); época actual; FROM_UNIXTIME(1700000000) para la inversa
  • PostgreSQL: SELECT EXTRACT(EPOCH FROM now()); época actual; to_timestamp(1700000000) para la inversa
  • SQLite: SELECT strftime('%s','now'); época actual; datetime(1700000000, 'unixepoch') para la inversa
  • SQL CAST AS DATE / sql cast as date — CAST(GETDATE() AS date) elimina la parte de hora y devuelve solo YYYY-MM-DD
  • SQL CAST datetime to date / sql cast datetime to date — CAST(your_datetime AS date) conserva solo la fecha de calendario
  • SQL CONVERT datetime / sql convert datetime — CONVERT(varchar, GETDATE(), 120) devuelve "YYYY-MM-DD HH:MI:SS"; el estilo 126 devuelve ISO 8601
  • SQL format date convert / sql format date convert — SQL Server: FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') para un diseño propio, o CONVERT(varchar, GETDATE(), 126) para ISO 8601
  • SQL CAST AS integer / sql cast as integer — CAST(value AS int) — útil para valores epoch en columnas numéricas
  • SQL convert from datetime to date / sql convert from datetime to date — CAST(dt AS date) o CONVERT(date, dt) elimina la parte de hora
  • SQL convert integer / sql convert integer — CAST(value AS bigint) para marcas de tiempo de 13 dígitos en ms que desbordan INT
  • SQL datetime to date / sql datetime to date — CAST(your_datetime AS date) devuelve solo YYYY-MM-DD

FAQ

¿Deberían almacenarse los milisegundos epoch en INT?
No. Las marcas de tiempo modernas en milisegundos tienen 13 dígitos y no caben de forma segura en un INT de 32 bits. Usa BIGINT o un tipo de marca de tiempo nativo.
¿Las marcas de tiempo de base de datos son siempre UTC?
No. El comportamiento depende del tipo de base de datos y de la zona horaria de la sesión. Sé explícito con UTC al importar, exportar y comparar valores entre sistemas.