No ecossistema do MySQL, a manipulação e conversão de tipos de dados temporais, como DATE, TIMESTAMP, DATETIME e cadeias de caracteres, é uma tarefa frequente. Abaixo estão as abordagens mais eficazes para realizar essas transformações.
1. Convertendo Cadeias de Caracteres para Tipos Temporais
Para transformar uma string em um objeto de data ou hora, a função STR_TO_DATE() é a escolha ideal, exigindo a especificação do padrão de formatação.
- String para
DATE:
SELECT STR_TO_DATE('15-11-2023', '%d-%m-%Y') AS data_extraida;
- String para
DATETIME/TIMESTAMP:
SELECT STR_TO_DATE('15/11/2023 09:45:30', '%d/%m/%Y %H:%i:%s') AS momento_completo;
2. Formatando Tipos Temporais como Strings
Quanndo o objetivo é exibir ou exportar dados temporais em um formato textual específico, utiliza-se a função DATE_FORMAT().
DATEpara String:
SELECT DATE_FORMAT(CURDATE(), '%d/%m/%Y') AS texto_data;
TIMESTAMPpara String:
SELECT DATE_FORMAT(NOW(), '%d-%m-%Y %H:%i') AS texto_timestamp;
3. Transições entre DATE e DATETIME/TIMESTAMP
Alternar entre tipos que armazenam apenas a data e aqueles que incluem o tempo requer atenções específicas, pois o MySQL preenche ausências com valores padrão.
DATEparaDATETIME: A porção temporal será automaticamente definida como00:00:00.
SELECT CAST('2023-11-15' AS DATETIME) AS data_para_datetime;
DATETIMEparaDATE: A funçãoDATE()isola apenas a parte da data.
SELECT DATE(NOW()) AS datetime_para_data;
4. Operações com Unix Timestamps
Unix timestamps representam o tempo em segundos desde a época Unix (01-01-1970). O MySQL oferece funções dedicadas para essa conversão.
- Unix Timestamp para
DATETIME: Emprega-seFROM_UNIXTIME().
-- Convertendo um timestamp Unix de 10 dígitos
SELECT FROM_UNIXTIME(1700000000) AS unix_para_datetime;
-- Se o timestamp estiver em milissegundos (13 dígitos), divida por 1000
SELECT FROM_UNIXTIME(1700000000000 / 1000) AS unix_ms_para_datetime;
DATETIMEpara Unix Timestamp: A funçãoUNIX_TIMESTAMP()realiza o caminho inverso.
SELECT UNIX_TIMESTAMP('2023-11-15 10:00:00') AS datetime_para_unix;
5. Conversões Explícitas com CAST e CONVERT
As funções CAST() e CONVERT() permitem forçar a mudança de tipo de dado de forma direta.
-- Convertendo string para DATE
SELECT CAST('2023-11-15 10:00:00' AS DATE) AS conversao_cast;
-- Convertendo DATETIME para string (CHAR)
SELECT CONVERT(NOW(), CHAR) AS conversao_convert;
6. Conversões com Ajuste de Fuso Horário
A função CONVERT_TZ() é essencial para traduzir um valor temporal de um fuso horário para outro, exigindo que as tabelas de fuso horário do MySQL estejam populadas.
-- Migrando um horário de UTC para o fuso horário de São Paulo (UTC-3)
SELECT CONVERT_TZ('2023-11-15 12:00:00', '+00:00', '-03:00') AS horario_ajustado;
7. Conversão Implícita de Strings
Se a string seguir estritamente o formato padrão YYYY-MM-DD HH:MM:SS, o MySQL pode realizar uma conversão implícita através de operações aritméticas ou contextos que esperam um número.
SELECT '2023-11-15 14:30:00' + 0 AS valor_numerico_temporal;
8. Referência de Especificadores de Formato
Ao utilizar funções como STR_TO_DATE e DATE_FORMAT, os seguintes modificadores são os mais comuns:
%Y: Ano com quatro dígitos%m: Mês com dois dígitos (01 a 12)%d: Dia do mês com dois dígitos (01 a 31)%H: Hora no formato de 24h (00 a 23)%i: Minutos (00 a 59)%s: Segundos (00 a 59)