SQL Snippets

Trechos de timestamp Unix em SQL

Exemplos de SQL para trabalhar com timestamps Unix no MySQL, PostgreSQL e SQLite, incluindo valores epoch atuais, conversão para datas e conversão de volta para 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')

Noções básicas de marcas de tempo em SQL

Cada banco de dados expõe auxiliares de marca de tempo Unix com nomes ligeiramente diferentes. O MySQL usa UNIX_TIMESTAMP(), o PostgreSQL pode extrair segundos epoch de now() e o SQLite comumente usa strftime('%s', 'now').

Notas de conversão em banco de dados

Armazene marcas de tempo como inteiros quando precisar de comparações numéricas rápidas, ou use tipos de marca de tempo nativos quando precisar de funções de fuso e data no nível do banco. Seja explícito sobre UTC nos limites de importação e exportação.

Notas de produção para SQL

A escolha da marca de tempo no banco deve combinar com como o valor será consultado. Segundos Unix inteiros são simples para janelas de log e varreduras de intervalo. Tipos de marca de tempo nativos são melhores quando o banco precisa agrupar por dia de calendário, truncar para o mês ou aplicar funções com fuso. Evite misturar ambas as representações sem uma regra de conversão clara.

  • Use BIGINT em vez de INT ao armazenar marcas de tempo em milissegundos
  • Use UTC para marcas de tempo importadas para que os servidores de aplicação concordem nos limites
  • Use intervalos semiabertos como created_at >= start and created_at < end
  • Indexe exatamente a coluna usada nos filtros de intervalo, sejam segundos epoch ou um tipo timestamp

Conversão de datetime em SQL: GETDATE, CONVERT, CAST

Usuários de SQL Server que buscam «datetime convert in sql», «getdate sql», «sql conversion date», «sql getdate date» ou «convert date timestamp to date» geralmente querem os auxiliares T-SQL GETDATE(), CONVERT() e CAST(). MySQL e PostgreSQL usam outros built-ins, mas a operação é a mesma: transformar um inteiro Unix em um datetime, ou um datetime no inteiro Unix correspondente.

  • SQL Server GETDATE() — datetime atual no fuso local do servidor; use 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()) remove a hora; CAST('2024-03-15T14:30:00' AS datetime2) analisa ISO 8601
  • MySQL: SELECT UNIX_TIMESTAMP(NOW()); época atual; FROM_UNIXTIME(1700000000) para a inversa
  • PostgreSQL: SELECT EXTRACT(EPOCH FROM now()); época atual; to_timestamp(1700000000) para a inversa
  • SQLite: SELECT strftime('%s','now'); época atual; datetime(1700000000, 'unixepoch') para a inversa
  • SQL CAST AS DATE / sql cast as date — CAST(GETDATE() AS date) remove a parte de hora e retorna apenas YYYY-MM-DD
  • SQL CAST datetime to date / sql cast datetime to date — CAST(your_datetime AS date) mantém apenas a data de calendário
  • SQL CONVERT datetime / sql convert datetime — CONVERT(varchar, GETDATE(), 120) retorna "YYYY-MM-DD HH:MI:SS"; o estilo 126 retorna ISO 8601
  • SQL format date convert / sql format date convert — SQL Server: FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss') para layout personalizado, ou CONVERT(varchar, GETDATE(), 126) para ISO 8601
  • SQL CAST AS integer / sql cast as integer — CAST(value AS int) — útil para valores epoch armazenados em colunas numéricas
  • SQL convert from datetime to date / sql convert from datetime to date — CAST(dt AS date) ou CONVERT(date, dt) remove a parte de hora
  • SQL convert integer / sql convert integer — CAST(value AS bigint) para marcas de tempo de 13 dígitos em ms que estouram INT
  • SQL datetime to date / sql datetime to date — CAST(your_datetime AS date) retorna apenas YYYY-MM-DD

FAQ

Os milissegundos epoch devem ser armazenados em INT?
Não. As marcas de tempo modernas em milissegundos têm 13 dígitos e não cabem com segurança em um INT de 32 bits. Use BIGINT ou um tipo de marca de tempo nativo.
As marcas de tempo de banco de dados são sempre UTC?
Não. O comportamento depende do tipo de banco de dados e do fuso da sessão. Seja explícito sobre UTC ao importar, exportar e comparar valores entre sistemas.