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

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.

Saytime, o relógio falante no Linux

Saiba como ouvir a hora, no Linux, com um relógio que sintetiza a voz humana.
O saytime informa a hora atual, no seu sistema, oralmente, usando arquivos de áudio pré-gravados e tem flexibilidade para ser configurado.
ícone de alto falante.

Como instalar e usar o saytime

No Ubuntu, no Debian ou em qualquer outra distro derivada, use o apt-get:

sudo apt-get install saytime

Após a instalação, execute o programa:

saytime

Se o seu áudio estiver ativo, vai ouvir uma voz natural masculina, informando a hora.
Se você estiver insatisfeito com o volume, pode dobrar seu valor com -v:

saytime -v 2

O valor 3, triplica; 4, quadruplica etc.
O relógio, por padrão, informa a hora no formato 12h — acrescentando AM ao horário da manhã e PM ao horário da tarde.
Quando a hora e os minutos são “redondos”, o locutor acrescenta “exactly” (exatamente) ao final da frase.
No tópico seguinte, vou mostrar como formatar a saída da hora.

Como formatar a saída do saytime

Os caracteres de formatação são os seguintes:

  • %k — informa a hora no padrão 24 horas.
  • %l — usa o padrão 12 horas.
  • %M — informa os minutos.
  • %S — informa os segundos.
  • %P — frase introdutória. Se você não quiser que o “locutor” comece a dar informação sobre a hora, com um “The time is“, suprima estes caracteres.

O padrão do programa é %P%l%M%S.
Veja um exemplo de formatação para dizer a hora, sem informar minutos e segundos, no formato 24 horas:

saytime -f %k

Acrescente a informação de horas e minutos à saída do saytime:

saytime -f %k%M%S

Como automatizar a informação de hora no sistema

A opção -r envia o programa pros bastidores (background) e passa a informar a cada intervalo de tempo a hora certa pra você.
No exemplo que segue, o saytime irá informar a hora, a cada 6 segundos, com o volume de áudio triplicado (3x), no formato HH:MM (hora e minuto):

saytime -r 6 -v 3 -f %k%M

Se quiser interromper o processo, use o comando pkill:

pkill -9 saytime

Como alterar a voz do saytime

Os arquivos de áudio do saytime ficam armazenados em /usr/share/saytime:

ls /usr/share/saytime
0.au   14.au  19.au  3.au   6.au   and.au      minutes.au  seconds.au
10.au  15.au  1.au   40.au  7.au   exactly.au  oclock.au   the_time_is.au
11.au  16.au  20.au  4.au   8.au   hour.au     oh.au
12.au  17.au  2.au   50.au  9.au   hours.au    pm.au
13.au  18.au  30.au  5.au   am.au  minute.au   second.au

Estes arquivos podem ser substituídos por outros, com os mesmos nomes e os mesmos formatos de áudio (.au).
Recomendo, fazer um backup dos arquivos originais antes —, após o quê, é possível, por exemplo, regravá-los com a sua voz, falando em português.
Supondo que você grave novos arquivos e os armazene no diretório ~/audio/, execute o saytime com a opção -d ~/audio/, para informar ao programa onde buscar seus arquivos de áudio. Veja como fica:

saytime -d ~/audio/

Espero que você se divirta e não perca mais a hora 😉