Jawaban Khalid sebagian besar benar. Tahun kabisat mengacaukan segalanya! Jika Anda menjalankan kueri yang diusulkan dengan nilai datecol '2016-02-29' dan CURRENT_DATE adalah '01-01-2017', misalnya, Anda mendapatkan null
.
Cara alternatif untuk menangani tahun kabisat dengan lebih anggun adalah seperti ini:
SELECT DATE_FORMAT(
MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
'%Y-%m-%d'
) `date`
FROM t
Nilai date
ini adalah 01-03-2017.
Sunting/klarifikasi:Masalahnya adalah mengubah tahun '2016-02-29' ke 2017, misalnya, menghasilkan '2017-02-29', yang bukan tanggal yang valid. Kemudian, menjalankan DATE_FORMAT('2017-02-29', '%Y-%m-%d') menghasilkan null
. Demo masalahnya ada di sini:
http://sqlfiddle.com/#!9/c5358/11
Namun, setelah meninjau jawaban saya, saya menyadari bahwa saya masalah lain dengan menggunakan MAKEDATE karena tanggal apa pun pada tahun kabisat setelah 28 Februari adalah hari +1 untuk tahun "normal" dengan 365 hari. Misalnya, jika datecol ='2016-03-01' dan tahun berjalan adalah 2017 maka tanggal yang dikonversi menjadi '03-02-2017', bukan '03-01' seperti yang diinginkan. Pendekatan yang lebih baik adalah sebagai berikut:
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
Metode ini mengubah 29 Februari menjadi 28, dan jika tidak, semua tanggal lainnya tetap persis seperti yang Anda harapkan. Demo solusinya ada di sini:
http://sqlfiddle.com/#!9/c5358/12