Het antwoord van Khalid is meestal correct. Schrikkeljaar verpest de boel! Als u de voorgestelde query uitvoert waarbij de waarde van datecol '2016-02-29' is en de CURRENT_DATE bijvoorbeeld '2017-01-01' is, krijgt u null
.
Een alternatieve manier om dit te doen die schrikkeljaar eleganter omgaat, is als volgt:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
De waarde van date
hier zou 2017-03-01 zijn.
Bewerken/verduidelijken:het probleem is dat het wijzigen van het jaar '29-02-2016' naar 2017 bijvoorbeeld '2017-02-29' oplevert, wat geen geldige datum is. Dan resulteert het uitvoeren van DATE_FORMAT('2017-02-29', '%Y-%m-%d') in null
. Een demo van het probleem is hier:
http://sqlfiddle.com/#!9/c5358/11
Na het bekijken van mijn antwoord realiseerde ik me echter dat ik een ander probleem had door MAKEDATE te gebruiken, aangezien elke datum op een schrikkeljaar na 28 februari dagen+1 is voor een "normaal" jaar met 365 dagen. Als datecol ='2016-03-01' en het huidige jaar 2017 was, dan zou de geconverteerde datum '2017-03-02' zijn, niet '2017-03-01' zoals gewenst. Een betere aanpak is als volgt:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Deze methode verandert elke 29 februari in de 28e en houdt verder alle andere datums precies zoals u ze zou verwachten. Een demo van de oplossing is hier:
http://sqlfiddle.com/#!9/c5358/12