A resposta de Khalid está correta na maioria das vezes. Ano bissexto bagunça as coisas! Se você executar a consulta proposta em que o valor de datecol é '2016-02-29' e CURRENT_DATE é '2017-01-01', por exemplo, você obtém
null
. SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
O valor de
date
aqui seria 2017-03-01. Editar/esclarecimento:O problema é que alterar o ano de '2016-02-29' para 2017, por exemplo, produz '2017-02-29', que não é uma data válida. Em seguida, executar DATE_FORMAT('2017-02-29', '%Y-%m-%d') resulta em
null
. Uma demonstração do problema está aqui:http://sqlfiddle.com/#!9/c5358/11
No entanto, depois de revisar minha resposta, percebi que havia outro problema usando MAKEDATE, pois qualquer data em um ano bissexto após 28 de fevereiro é dias + 1 para um ano "normal" com 365 dias. Por exemplo, se datecol ='2016-03-01' e o ano atual fosse 2017, a data convertida seria '2017-03-02', não '2017-03-01' conforme desejado. Uma abordagem melhor é a seguinte:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Esse método transforma qualquer dia 29 de fevereiro em 28 e mantém todas as outras datas exatamente como você esperaria. Uma demonstração da solução está aqui:
http://sqlfiddle.com/#!9/c5358/12