Odpowiedź Khalida jest przez większość czasu poprawna. Rok przestępny psuje wszystko! Jeśli uruchomisz proponowane zapytanie, w którym wartość datecol to „2016-02-29”, a CURRENT_DATE to „2017-01-01”, na przykład otrzymasz null
.
Inny sposób na zrobienie tego, który lepiej radzi sobie z rokiem przestępnym, jest następujący:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Wartość date
tutaj byłby 01.03.2017.
Edycja/wyjaśnienie:Problem polega na tym, że zmiana roku „2016-02-29” na 2017, na przykład, daje „2017-02-29”, co nie jest prawidłową datą. Następnie uruchomienie DATE_FORMAT('2017-02-29', '%Y-%m-%d') daje wynik null
. Prezentacja problemu jest tutaj:
http://sqlfiddle.com/#!9/c5358/11
Jednak po przejrzeniu mojej odpowiedzi zdałem sobie sprawę, że mam kolejny problem, używając MAKEDATE, ponieważ dowolna data w roku przestępnym po 28 lutego to dni + 1 dla „normalnego” roku z 365 dniami. Na przykład, jeśli datecol =„2016-03-01”, a bieżący rok to 2017, przekonwertowana data będzie miała wartość „2017-03-02”, a nie „2017-03-01”, zgodnie z wymaganiami. Lepsze podejście jest następujące:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Ta metoda zamienia dowolny 29 lutego na 28, a poza tym zachowuje wszystkie inne daty dokładnie tak, jak można by się tego spodziewać. Demo rozwiązania jest tutaj:
http://sqlfiddle.com/#!9/c5358/12