Câu trả lời của Khalid hầu hết đều đúng. Năm nhuận làm mọi thứ rối tung lên! Ví dụ:nếu bạn chạy truy vấn được đề xuất trong đó giá trị của datecol là '2016-02-29' và CURRENT_DATE là '2017-01-01', bạn nhận được null
.
Một cách thay thế để làm điều này giúp xử lý năm nhuận một cách duyên dáng hơn là như sau:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Giá trị của date
đây sẽ là 2017-03-01.
Chỉnh sửa / làm rõ:Vấn đề là việc thay đổi năm '2016-02-29' thành 2017, chẳng hạn như '2017-02-29', không phải là ngày hợp lệ. Sau đó, chạy DATE_FORMAT ('2017-02-29', '% Y-% m-% d') cho kết quả là null
. Bản demo của vấn đề ở đây:
http://sqlfiddle.com/#!9/c5358/11
Tuy nhiên, sau khi xem lại câu trả lời của mình, tôi nhận ra rằng tôi gặp một vấn đề khác khi sử dụng MAKEDATE vì bất kỳ ngày nào trong năm nhuận sau ngày 28 tháng 2 là ngày + 1 cho một năm "bình thường" có 365 ngày. Ví dụ:nếu datecol ='2016-03-01' và năm hiện tại là 2017 thì ngày chuyển đổi sẽ là '2017-03-02', không phải '2017-03-01' như mong muốn. Một cách tiếp cận tốt hơn như sau:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Phương pháp này biến bất kỳ ngày 29 tháng 2 thành ngày 28 và nếu không sẽ giữ tất cả các ngày khác chính xác như bạn mong đợi. Bản demo của giải pháp ở đây:
http://sqlfiddle.com/#!9/c5358/12