sql >> データベース >  >> RDS >> Mysql

mysqlは日付を現在の年の同じ日付に変換します

    ハリドの答えはほとんどの場合正しいです。うるう年は物事を台無しにします!たとえば、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



    1. MySQLで数値を8進数に変換する2つの方法

    2. 'max_user_connections'を200に設定-それでもエラーが発生する

    3. 特定のポイントまで合計-MySql

    4. PostgreSQLでデータを分割するためのガイド