ハリドの答えはほとんどの場合正しいです。うるう年は物事を台無しにします!たとえば、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
しかし、私の答えを確認した後、2月28日以降のうるう年の日付は365日である「通常の」年の日+1であるため、MAKEDATEを使用することで別の問題があることに気付きました。たとえば、datecol ='2016-03-01'で、現在の年が2017の場合、変換された日付は'2017-03-01'ではなく'2017-03-02'になります。より良いアプローチは次のとおりです。
SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;
この方法では、2月29日が28日になります。それ以外の場合は、他のすべての日付が予想どおりに保持されます。ソリューションのデモはこちらです:
http://sqlfiddle.com/#!9/c5358/12