La respuesta de Khalid es correcta la mayor parte del tiempo. ¡El año bisiesto arruina las cosas! Si ejecuta la consulta propuesta donde el valor de datecol es '2016-02-29' y CURRENT_DATE es '2017-01-01', por ejemplo, obtiene null
.
Una forma alternativa de hacer esto que maneja el año bisiesto con más gracia es así:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
El valor de date
aquí sería 2017-03-01.
Edición/aclaración:el problema es que cambiar el año '2016-02-29' a 2017, por ejemplo, produce '2017-02-29', que no es una fecha válida. Luego, ejecutar DATE_FORMAT('2017-02-29', '%Y-%m-%d') da como resultado null
. Una demostración del problema está aquí:
http://sqlfiddle.com/#!9/c5358/11
Sin embargo, después de revisar mi respuesta, me di cuenta de que tenía otro problema al usar MAKEDATE, ya que cualquier fecha en un año bisiesto posterior al 28 de febrero es días+1 para un año "normal" con 365 días. Por ejemplo, si datecol ='2016-03-01' y el año actual fuera 2017, la fecha convertida sería '2017-03-02', no '2017-03-01' como se desea. Un mejor enfoque es el siguiente:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Este método convierte cualquier 29 de febrero en 28 y, por lo demás, mantiene todas las demás fechas exactamente como las esperaría. Una demostración de la solución está aquí:
http://sqlfiddle.com/#!9/c5358/12