Khalids svar är korrekt för det mesta. Skottår förstör saker! Om du kör den föreslagna frågan där värdet på datecol är "2016-02-29" och CURRENT_DATE är "2017-01-01", till exempel, får du null
.
Ett alternativt sätt att göra detta som hanterar skottår mer graciöst är så här:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Värdet på date
här skulle vara 2017-03-01.
Redigera/förtydligande:Problemet är att om du ändrar årtalet '2016-02-29' till 2017, till exempel, produceras '2017-02-29', vilket inte är ett giltigt datum. Att sedan köra DATE_FORMAT('2017-02-29', '%Y-%m-%d') resulterar i null
. En demo av problemet finns här:
http://sqlfiddle.com/#!9/c5358/11
Men efter att ha granskat mitt svar insåg jag att jag har ett annat problem genom att använda MAKEDATE eftersom alla datum på ett skottår efter den 28 februari är dagar+1 för ett "normalt" år med 365 dagar. Till exempel, om datecol ='2016-03-01' och det aktuella året var 2017 skulle det konverterade datumet vara '2017-03-02', inte '2017-03-01' som önskat. Ett bättre tillvägagångssätt är följande:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Den här metoden förvandlar vilken 29:e februari som helst till den 28:e och i övrigt behåller alla andra datum precis som du förväntar dig. En demo av lösningen finns här:
http://sqlfiddle.com/#!9/c5358/12