Como criar datas aleatórias no MySQL – Elias Praciano
Categories
Banco de dados Tutoriais

Como criar datas aleatórias no MySQL

Como obter datas aleatórias no MySQL, com o uso de funções e como substituir as datas existentes em uma tabela por outras criadas aleatoriamente.

Com o uso das funções CONCAT(), FLOOR() e RAND(), é possível criar datas aleatórias no MySQL. Como o comando UPDATE, você pode efetuar a substituição de todas as datas de uma tabela por outras completamente aleatórias.
Qualquer que seja o seu motivo, imagino que você queira ter controle sobre as datas geradas aleatoriamente — que os anos, os meses e, possivelmente, os dias estejam dentro de faixas especificas.
No exemplo, abaixo, vamos criar datas em que apenas os meses serão aleatórios, variando de 1 a 12:

SELECT CONCAT('2015-',FLOOR(1+RAND()*12),'-02');
+-----------------------------------------+
| CONCAT('2015-',FLOOR(1+RAND()*12),'-02') |
+-----------------------------------------+
|  2015-2-02                              |
+-----------------------------------------+

Agora, vamos usar o ano e o dia atuais, com a função CURDATE():

SELECT CONCAT(YEAR(CURDATE()),'-',FLOOR(1+RAND()*12),'-',DAY(CURDATE()));
+------------------------------------------------------------------+
| CONCAT(YEAR(CURDATE()),'-',FLOOR(1+RAND()*12),'-',DAY(CURDATE())) |
+------------------------------------------------------------------+
| 2015-5-15                                                        |
+------------------------------------------------------------------+

Altere as queries para que se encaixem às suas necessidades.
Embora sejam válidas, as datas dos exemplos acima, não se encaixam nos padrões ISO 8601 e não poderão ser corretamente gravadas dentro de campos date ou datetime.
Para tanto, as datas teriam que ser 2015-02-02 e 2015-05-15 — ou seja, 4 dígitos na seção do ano, 2 dígitos na seção do mês e 2 dígitos na seção do dia.
Para garantir que os números dos meses e dos dias satisfaçam estas condições, seguem os exemplos anteriores, reformulados, com a inclusão da função LPAD():

SELECT CONCAT('2015-',LPAD(FLOOR(1+RAND()*12),2,'0'),'-02');
+------------------------------------------------------+
| CONCAT('2015-',LPAD(FLOOR(1+RAND()*12),2,'0'),'-02') |
+------------------------------------------------------+
| 2015-02-02                                           |
+------------------------------------------------------+

… e no segundo exemplo:

SELECT CONCAT(YEAR(CURDATE()),'-',LPAD(FLOOR(1+RAND()*12),2,'0'),'-',DAY(CURDATE()));
+-------------------------------------------------------------------------------+
| CONCAT(YEAR(CURDATE()),'-',LPAD(FLOOR(1+RAND()*12),2,'0'),'-',DAY(CURDATE())) |
+-------------------------------------------------------------------------------+
| 2015-10-16                                                                    |
+-------------------------------------------------------------------------------+

Leia mais sobre o uso das funções CONCAT() e LPAD() em Como converter strings de data para padrão ISO 8601.

Como substituir as datas de uma coluna da tabela por novas datas aleatórias

Para mudar todas as datas de uma coluna, dentro da tabela, use o UPDATE:

UPDATE clientesEstaduais SET DataCadastro = CONCAT('2015-',LPAD(FLOOR(1+RAND()*12),2,'0'),'-02');

Substitua, no exemplo acima, ‘clientesEstaduais’ pelo nome da sua tabela e ‘DataCadastro’ pelo nome da coluna cujas informações serão alteradas.
Se você quiser, pode obter a tabela ‘clientesEstaduais’ aqui.
No próximo exemplo, todos os componentes da data serão atualizados aleatoriamente (ano, mês e dia) — obedecendo os seguintes parâmetros:

  • Os anos têm que estar entre 2014 e 2016
  • Os valores referentes aos meses têm que estar comprendidos entre 1 e 12
  • Os valores dos dias, para ter alguma segurança em relação a meses com quantidade de dias diferentes, ficam compreendidos entre 1 e 27 — o que garante que nenhum fique com data inválida (por exemplo: 2016-02-31)

Veja o código:

UPDATE clientesEstaduais SET DataCadastro = CONCAT(FLOOR(2014+RAND()*3),'-', LPAD(FLOOR(1+RAND()*12),2,'0'),'-', LPAD(FLOOR(1+RAND()*27),2,'0'));

Desta vez, a gama de datas contidas na minha tabela, ficou bem mais variada:

SELECT DataCadastro FROM clientesEstaduais LIMIT 10;
+--------------+
| DataCadastro |
+--------------+
| 2016-11-07   |
| 2015-01-14   |
| 2015-09-04   |
| 2015-02-09   |
| 2014-04-07   |
| 2015-02-16   |
| 2015-05-16   |
| 2016-11-11   |
| 2014-10-07   |
| 2016-10-08   |
+--------------+

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.