Khalidova odpověď je většinou správná. Přestupný rok věci zpacká! Pokud spustíte navrhovaný dotaz, kde hodnota datecol je '2016-02-29' a CURRENT_DATE je například '2017-01-01', dostanete null
.
Alternativní způsob, jak toho dosáhnout, který zvládá přestupný rok elegantněji, je tento:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Hodnota date
zde by bylo 2017-03-01.
Úprava/upřesnění:Problém je v tom, že například změnou roku '2016-02-29' na 2017 vznikne '2017-02-29', což není platné datum. Poté spuštěním DATE_FORMAT('2017-02-29', '%Y-%m-%d') výsledkem bude null
. Ukázka problému je zde:
http://sqlfiddle.com/#!9/c5358/11
Po přezkoumání mé odpovědi jsem si však uvědomil, že mám další problém s použitím MAKEDATE, protože jakékoli datum v přestupném roce po 28. únoru je dny + 1 pro „normální“ rok s 365 dny. Pokud například datecol ='2016-03-01' a aktuální rok byl 2017, převedené datum by bylo '2017-03-02', nikoli '2017-03-01', jak je požadováno. Lepší přístup je následující:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Tato metoda změní jakýkoli 29. únor na 28. a jinak zachová všechna ostatní data přesně tak, jak byste je očekávali. Ukázka řešení je zde:
http://sqlfiddle.com/#!9/c5358/12