DATETIME vs TIMESTAMP (Data + Hora)
⭐ Essencial 💾 TIMESTAMP: 4 Bytes (MySQL) | DATETIME: 5 a 8 BytesRegistros de data e hora completa (AAAA-MM-DD HH:MM:SS) para eventos, agendamentos e auditoria.
Ambos guardam data e hora (`YYYY-MM-DD HH:MM:SS`), mas têm uma diferença vital: o `TIMESTAMP` converte automaticamente o horário da sessão para UTC ao salvar no disco e converte de volta para o fuso horário atual ao consultar (ótimo para `created_at` e `updated_at`), ocupando 4 bytes (nota: no MySQL de 32-bits/antigo o TIMESTAMP vai até 2038; no PostgreSQL `TIMESTAMPTZ` ocupa 8 bytes e não tem limite de 2038). Já o `DATETIME` ocupa 5 a 8 bytes, vai do ano 1000 ao 9999 e guarda a data/hora literal sem conversão de fuso (ideal para agendamentos futuros como consultas médicas).
✅ Quando Usar (Casos Ideais)
- • Use `TIMESTAMP` (ou `TIMESTAMPTZ` no Postgres) para carimbos de auditoria do momento exato em que algo aconteceu: `criado_em`, `atualizado_em`, `pago_em`, `deletado_em`.
- • Use `DATETIME` para datas futuras distantes (após 2038 no MySQL) ou agendamentos civis fixos (`data_hora_consulta DATETIME`).
🚫 Quando NÃO Usar (Armadilhas)
- • Não use `INT` para guardar Unix Timestamp manual se quiser usar funções de data nativas do SQL de forma legível nos relatórios e no DrawDB.
📐 Como Configurar no DrawDB Abrir DrawDB ↗
DATETIME ou TIMESTAMP DEFAULT CURRENT_TIMESTAMP
TIMESTAMPTZ (TIMESTAMP WITH TIME ZONE) DEFAULT CURRENT_TIMESTAMP
DATETIME DEFAULT CURRENT_TIMESTAMP
📋 Exemplos Reais de Colunas com TIMESTAMP:
CREATE TABLE consultas_medicas (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
paciente_id BIGINT UNSIGNED NOT NULL,
agendado_para DATETIME NOT NULL,
criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
cancelado_em TIMESTAMP NULL DEFAULT NULL
);
<?php
declare(strict_types=1);
date_default_timezone_set('America/Sao_Paulo');
$agendamento = new DateTimeImmutable('2026-11-10 14:30:00');
$stmt = $pdo->prepare('
INSERT INTO consultas_medicas (paciente_id, agendado_para)
VALUES (:paciente_id, :agendado_para)
');
$stmt->bindValue(':paciente_id', 77, PDO::PARAM_INT);
$stmt->bindValue(':agendado_para', $agendamento->format('Y-m-d H:i:s'), PDO::PARAM_STR);
$stmt->execute();