Khalids svar er det meste af tiden rigtigt. Skudår roder tingene sammen! Hvis du kører den foreslåede forespørgsel, hvor værdien af datecol er '2016-02-29' og CURRENT_DATE er '2017-01-01', for eksempel, får du null
.
En alternativ måde at gøre dette på, der håndterer skudår mere yndefuldt, er sådan her:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Værdien af date
her ville være 2017-03-01.
Redigering/afklaring:Problemet er, at ændring af årstallet '2016-02-29' til 2017 f.eks. giver '2017-02-29', hvilket ikke er en gyldig dato. Kørsel af DATE_FORMAT('2017-02-29', '%Y-%m-%d') resulterer derefter i null
. En demo af problemet er her:
http://sqlfiddle.com/#!9/c5358/11
Men efter at have gennemgået mit svar indså jeg, at jeg har et andet problem ved at bruge MAKEDATE, da enhver dato på et skudår efter 28. februar er dage+1 for et "normalt" år med 365 dage. For eksempel, hvis datecol ='2016-03-01' og det aktuelle år var 2017, ville den konverterede dato være '2017-03-02', ikke '2017-03-01' som ønsket. En bedre tilgang er som følger:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Denne metode forvandler enhver 29. februar til den 28. og holder ellers alle andre datoer nøjagtigt, som du ville forvente dem. En demo af løsningen er her:
http://sqlfiddle.com/#!9/c5358/12