Transformar strings contendo valores temporais (de data e/ou hora) pode ser útil quando se deseja realizar operações aritméticas, envolvendo-os. Os valores podem ser convertidos de volta para data e/ou hora, com relativa facilidade.
O processo consiste, basicamente em adicionar o valor zero ou usar o valor temporal em um contexto numérico — o MySQL irá entender que aquele valor é um número.
Veja um exemplo:
SELECT CURRENT_DATE() AS Hoje, CURRENT_DATE()+0 AS "Hoje, como núm."; +------------+------------------+ | Hoje | Hoje, como núm. | +------------+------------------+ | 2015-07-14 | 20150714 | +------------+------------------+
CURRENT_DATE() é a função responsável por retornar a data atual. Como você pode ver, no exemplo acima, ao adicionar 0 (zero), o valor passou de data para número.
Na condição de valor numérico, é possível realizar todas as operações aritméticas e, em seguida, voltar (nem sempre…) a valor temporal.
Veja outro exemplo:
SELECT DATE(DataCadastroCliente) AS Cadastro, DATE(DataCadastroCliente)+0 AS "Número", YEAR(DataCadastroCliente)+1 AS "Ano +1" FROM CadastroClientes LIMIT 10; +------------+----------+--------+ | Cadastro | Número | Ano +1 | +------------+----------+--------+ | 2016-03-29 | 20160329 | 2017 | | 2015-06-20 | 20150620 | 2016 | | 2013-03-29 | 20130329 | 2014 | | 2015-11-29 | 20151129 | 2016 | | 2016-06-11 | 20160611 | 2017 | | 2014-06-14 | 20140614 | 2015 | | 2015-08-31 | 20150831 | 2016 | | 2012-08-28 | 20120828 | 2013 | | 2013-05-29 | 20130529 | 2014 | | 2013-06-03 | 20130603 | 2014 | +------------+----------+--------+
Fique atento.
Ao adicionar 0 (ou qualquer outro valor numérico) a um valor temporal, este deixa de ter valor temporal e passa a ser uma simples string numérica.
Essencialmente, você deve esperar, como resultado, uma string sem os delimitadores de data.
Mas apenas o primeiro componente da data ou da hora será interpretado como numérico, durante a conversão. Veja por si só:
SELECT '2016-01-01'+0, '2016-01-01 15:45:25'+0, '15:45:25'+0; +----------------+-------------------------+--------------+ | '2016-01-01'+0 | '2016-01-01 15:45:25'+0 | '15:45:25'+0 | +----------------+-------------------------+--------------+ | 2016 | 2016 | 15 | +----------------+-------------------------+--------------+
Para resolver isto, use as funções SEC_TO_TIME() e TIME_TO_SEC().