6. Datas, Horários & Auditoria
TIME & YEAR (Hora Isolada e Ano)
TIME armazena horários do dia ou durações (HH:MM:SS); YEAR armazena um ano em 1 Byte.
💾 Espaço em Disco: TIME: 3 Bytes | YEAR: 1 Byte
📏 Limites: TIME: -838:59:59 a 838:59:59 | YEAR: 1901 a 2155
O tipo `TIME` (3 bytes) é ideal para horários recorrentes que independem de um dia específico, como horário de abertura e fechamento de uma loja (`08:00:00` às `18:00:00`). Já o tipo `YEAR` no MySQL ocupa apenas 1 byte para anos entre 1901 e 2155.
✅ Quando Usar
- •Horário comercial de abertura e fechamento (`abre_as TIME`, `fecha_as TIME`).
- •Horário de início de uma turma escolar (`horario_aula TIME`).
🚫 Quando NÃO Usar
- •Para anos fora da faixa de 1901 a 2155 (use `SMALLINT` em vez de `YEAR` para maior compatibilidade com PostgreSQL e SQLite).
📐 Configuração no DrawDB
- Type:
- TIME
- Size / Values:
- Vazio
- Default:
- Ex: 08:00:00
MySQL / MariaDB
TIME
PostgreSQL
TIME
SQLite
TEXT
🗄️ SQL DDL (Pronto para Importar no DrawDB)
CREATE TABLE horarios_funcionamento (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
dia_semana TINYINT UNSIGNED NOT NULL COMMENT '1=Dom, 2=Seg ... 7=Sab',
horario_abertura TIME NOT NULL,
horario_fechamento TIME NOT NULL
);
🐘 Exemplo Prático em PHP 8 + PDO
<?php
declare(strict_types=1);
$abertura = '08:30:00';
$fechamento = '18:00:00';
if (!preg_match('/^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/', $abertura)) {
throw new InvalidArgumentException('Horário inválido.');
}
$stmt = $pdo->prepare('
INSERT INTO horarios_funcionamento (dia_semana, horario_abertura, horario_fechamento)
VALUES (:dia, :abre, :fecha)
');
$stmt->bindValue(':dia', 2, PDO::PARAM_INT); // Segunda-feira
$stmt->bindValue(':abre', $abertura, PDO::PARAM_STR);
$stmt->bindValue(':fecha', $fechamento, PDO::PARAM_STR);
$stmt->execute();