Отговорът на Халид е правилен през повечето време. Високосната година обърква нещата! Ако изпълните предложената заявка, където стойността на datecol е '2016-02-29' и CURRENT_DATE е '2017-01-01', например, получавате null
.
Алтернативен начин да направите това, който обработва високосната година по-елегантно, е като този:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Стойността на date
тук ще бъде 2017-03-01.
Редактиране/разяснение:Проблемът е, че промяната на годината от „2016-02-29“ на 2017, например, произвежда „2017-02-29“, което не е валидна дата. След това изпълнението на DATE_FORMAT('2017-02-29', '%Y-%m-%d') води до null
. Демонстрация на проблема е тук:
http://sqlfiddle.com/#!9/c5358/11
Въпреки това, след като прегледах отговора си, осъзнах, че имам друг проблем, като използвам MAKEDATE, тъй като всяка дата на високосна година след 28 февруари е дни+1 за "нормална" година с 365 дни. Например, ако datecol ='2016-03-01' и текущата година е 2017, тогава преобразуваната дата ще бъде '2017-03-02', а не '2017-03-01', както желаете. По-добър подход е следният:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Този метод превръща всеки 29 февруари в 28-ми и в противен случай запазва всички други дати точно както бихте очаквали. Демонстрация на решението е тук:
http://sqlfiddle.com/#!9/c5358/12