La réponse de Khalid est correcte la plupart du temps. Les années bissextiles gâchent les choses ! Si vous exécutez la requête proposée où la valeur de datecol est '2016-02-29' et le CURRENT_DATE est '2017-01-01', par exemple, vous obtenez null
.
Une autre façon de faire cela qui gère les années bissextiles plus gracieusement est la suivante :
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
La valeur de date
ici serait 2017-03-01.
Modification/clarification :le problème est que le changement de l'année de '2016-02-29' en 2017, par exemple, produit '2017-02-29', qui n'est pas une date valide. Ensuite, l'exécution de DATE_FORMAT('2017-02-29', '%Y-%m-%d') donne null
. Une démo du problème est ici :
http://sqlfiddle.com/#!9/c5358/11
Cependant, après avoir examiné ma réponse, j'ai réalisé que j'avais un autre problème en utilisant MAKEDATE car toute date d'une année bissextile après le 28 février correspond à jours + 1 pour une année "normale" de 365 jours. Par exemple, si datecol ='2016-03-01' et que l'année en cours était 2017, la date convertie serait '2017-03-02', et non '2017-03-01' comme souhaité. Une meilleure approche est la suivante :
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Cette méthode transforme n'importe quel 29 février en 28 et conserve toutes les autres dates exactement comme vous vous y attendiez. Une démo de la solution est ici :
http://sqlfiddle.com/#!9/c5358/12