Como converter strings de data para padrões aceitáveis pelo MySQL – Elias Praciano
Categories
Banco de dados Tutoriais

Como converter strings de data para padrões aceitáveis pelo MySQL

O MySQL usa o padrão ISO 8601 para armazenar suas datas. Saiba com criar strings contendo datas válidas, com o uso das funções CONCAT e LPAD.

Uma string, representando uma informação de data, não pode ser gravada corretamente no MySQL, se não estiver de acordo com as normas descritas na ISO 8601.
Para evitar erros e imprevistos, devemos usar algumas funções do MySQL, para tratar as strings e garantir que as datas sejam armazenadas adequadamente, de acordo com o você previa.
mysql-concat-date
Os formatos de data e hora, no MySQL, são expostos em maiores detalhes neste artigo.
Uma dos métodos para converter strings em datas padrão do MySQL, faz uso da função CONCAT().
No exemplo, abaixo, veja que as duas colunas expressam datas:

  • a primeira expressa datas dentro do formato DATETIME e está de acordo com o padrão ISO 8601;
  • a segunda contém datas constituídas a partir da primeira coluna, só que algumas destas datas estão fora do padrão ISO, que pede que o número referente ao mês ou ao dia seja representado por 2 dígitos — ou seja, o correto é ’04’. O mês ‘4’ (sem o dígito zero, à sua esquerda) está fora do padrão e, portanto, invalida esta string, como data passível de ser armazenada.
SELECT DataNascimentoCliente, CONCAT(YEAR(DataNascimentoCliente),'-',MONTH(DataNascimentoCliente),'-',DAY(DataNascimentoCliente)) FROM CadastroClientes LIMIT 5;
+-----------------------+-----------------------------------------------------------------------------------------------------+
| DataNascimentoCliente | CONCAT(YEAR(DataNascimentoCliente),'-',MONTH(DataNascimentoCliente),'-',DAY(DataNascimentoCliente)) |
+-----------------------+-----------------------------------------------------------------------------------------------------+
| 1984-04-11 19:32:05   | 1984-4-11                                                                                           |
| 1984-12-22 02:53:07   | 1984-12-22                                                                                          |
| 1981-05-14 03:12:50   | 1981-5-14                                                                                           |
| 1983-10-01 22:40:44   | 1983-10-1                                                                                           |
| 1969-12-16 11:01:39   | 1969-12-16                                                                                          |
+-----------------------+-----------------------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)

Se temos 3 datas inválidas, na relação acima, vejamos como resolver o problema e inseri-las no padrão de armazenamento de datas do MySQL.
Use a função LPAD() para completar os caracteres faltantes na parte do Mês e na parte do dia:

SELECT DataNascimentoCliente, CONCAT(YEAR(DataNascimentoCliente),'-',LPAD(MONTH(DataNascimentoCliente),2,'0'),'-',LPAD(DAY(DataNascimentoCliente),2,'0')) FROM CadastroClientes LIMIT 5;
+-----------------------+-----------------------------------------------------------------------------------------------------------------------------+
| DataNascimentoCliente | CONCAT(YEAR(DataNascimentoCliente),'-',LPAD(MONTH(DataNascimentoCliente),2,'0'),'-',LPAD(DAY(DataNascimentoCliente),2,'0')) |
+-----------------------+-----------------------------------------------------------------------------------------------------------------------------+
| 1984-04-11 19:32:05   | 1984-04-11                                                                                                                  |
| 1984-12-22 02:53:07   | 1984-12-22                                                                                                                  |
| 1981-05-14 03:12:50   | 1981-05-14                                                                                                                  |
| 1983-10-01 22:40:44   | 1983-10-01                                                                                                                  |
| 1969-12-16 11:01:39   | 1969-12-16                                                                                                                  |
+-----------------------+-----------------------------------------------------------------------------------------------------------------------------+
5 rows in set (0.01 sec)

Isto é o suficiente para padronizar as datas da segunda coluna, de acordo com o que o MySQL exige.
O próximo passo é desnecessário — mas tem o objetivo de melhorar a estética do relatório, com a redução da extensão dos títulos das colunas:

SELECT DataNascimentoCliente AS "Data original", CONCAT(YEAR(DataNascimentoCliente),'-',LPAD(MONTH(DataNascimentoCliente),2,'0'),'-',LPAD(DAY(DataNascimentoCliente),2,'0')) AS "Data" FROM CadastroClientes LIMIT 5;
+---------------------+------------+
| Data original       | Data       |
+---------------------+------------+
| 1984-04-11 19:32:05 | 1984-04-11 |
| 1984-12-22 02:53:07 | 1984-12-22 |
| 1981-05-14 03:12:50 | 1981-05-14 |
| 1983-10-01 22:40:44 | 1983-10-01 |
| 1969-12-16 11:01:39 | 1969-12-16 |
+---------------------+------------+
5 rows in set (0.00 sec)

Na forma em que se encontram, agora, os dados da segunda coluna, podem ser armazenados diretamente nesta ou em outra tabela e podem participar de operações aritméticas envolvendo datas.
A função LPAD() serve para ajustar as strings. Possui 3 parâmetros e sua sintaxe é LPAD(str,len,padstr) em que:

  • str — é a string sobre a qual será feita a operação
  • len — o limite de tamanho que a string deve ter
  • padstr — caractere que deverá preencher a nova os espaços “sobrantes”, se houver

O “L” do nome LPAD, quer dizer left (esquerda) e indica de que ponto da string a operação deverá começar.
Por fim, das inúmeras maneiras existentes para se padronizar datas no MySQL para o formato ISO, esta é apenas uma.

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.