Conversão entre Datas, Timestamps e Strings no MySQL

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().

  • DATE para String:
SELECT DATE_FORMAT(CURDATE(), '%d/%m/%Y') AS texto_data;
  • TIMESTAMP para 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.

  • DATE para DATETIME: A porção temporal será automaticamente definida como 00:00:00.
SELECT CAST('2023-11-15' AS DATETIME) AS data_para_datetime;
  • DATETIME para DATE: A função DATE() 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-se FROM_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;
  • DATETIME para Unix Timestamp: A função UNIX_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)

Tags: MySQL SQL STR_TO_DATE DATE_FORMAT UNIX_TIMESTAMP

Publicado em 10-17 09:24