0

DATE_FORMAT 関数を拡張してフランス語の月と日の名前を取得する UDF を作成しました。

%a%b%Wおよび を%M別々に正しい単語に置き換えます。CASE ステートメントを使用して英語をフランス語に変換し、書式文字列タグを見つかった単語に置き換えます。

それは正常に動作します。

delimiter |
/*DROP FUNCTION DATE_FORMAT_FR*/
|
CREATE FUNCTION DATE_FORMAT_FR (dt DATETIME, f VARCHAR(32))
RETURNS VARCHAR(255) DETERMINISTIC NO SQL
BEGIN
    DECLARE name VARCHAR(16);
    /*short day name*/
    IF INSTR(f, '%a') >= 0 THEN
        SET name = CASE DATE_FORMAT(dt, '%a')
            WHEN 'Mon' THEN 'Lun'
            WHEN 'Tue' THEN 'Mar'
            WHEN 'Wed' THEN 'Mer'
            WHEN 'Thu' THEN 'Jeu'
            WHEN 'Fri' THEN 'Ven'
            WHEN 'Sat' THEN 'Sam'
            WHEN 'Sun' THEN 'Dim'
            ELSE DATE_FORMAT(dt, '%a')
            END;
            /*replace in source format string*/
            SET f = REPLACE(f, '%a', name);
    END IF;
    /*long day name*/
    IF INSTR(f, '%W') >= 0 THEN
        SET name = CASE DATE_FORMAT(dt, '%W')
            WHEN 'Monday' THEN 'Lundi'
            WHEN 'Tuesday' THEN 'Mardi'
            WHEN 'Wednesday' THEN 'Mercredi'
            WHEN 'Thursday' THEN 'Jeudi'
            WHEN 'Friday' THEN 'Vendredi'
            WHEN 'Saturday' THEN 'Samedi'
            WHEN 'Sunday' THEN 'Dimanche'
            ELSE DATE_FORMAT(dt, '%W')
            END;
            /*replace in source format string*/
            SET f = REPLACE(f, '%W', name);
    END IF;
     /*short month name*/
    IF INSTR(f, '%b') >= 0 THEN
        SET name = CASE DATE_FORMAT(dt, '%b')
            WHEN 'Jan' THEN 'Jan'
            WHEN 'Feb' THEN 'Fév'
            WHEN 'Mar' THEN 'Mar'
            WHEN 'Apr' THEN 'Avr'
            WHEN 'May' THEN 'Mai'
            WHEN 'Jun' THEN 'Juin'
            WHEN 'Jul' THEN 'Juil'
            WHEN 'Aug' THEN 'Août'
            WHEN 'Sep' THEN 'Sept'
            WHEN 'Oct' THEN 'Oct'
            WHEN 'Nov' THEN 'Nov'
            WHEN 'Dec' THEN 'Déc'
            ELSE DATE_FORMAT(dt, '%b')
            END;
            /*replace in source format string*/
            SET f = REPLACE(f, '%b', name);
    END IF;
    /*long month name*/
    IF INSTR(f, '%M') >= 0 THEN
        SET name = CASE DATE_FORMAT(dt, '%b')
            WHEN 'Jan' THEN 'Janvier'
            WHEN 'Feb' THEN 'Février'
            WHEN 'Mar' THEN 'Mars'
            WHEN 'Apr' THEN 'Avril'
            WHEN 'May' THEN 'Mai'
            WHEN 'Jun' THEN 'Juin'
            WHEN 'Jul' THEN 'Juillet'
            WHEN 'Aug' THEN 'Août'
            WHEN 'Sep' THEN 'Septembre'
            WHEN 'Oct' THEN 'Octobre'
            WHEN 'Nov' THEN 'Novembre'
            WHEN 'Dec' THEN 'D\351cembre'
            ELSE DATE_FORMAT(dt, '%M')
            END;
            /*replace in source format string*/
            SET f = REPLACE(f, '%M', name);
    END IF;
    /*returns standard conversion*/
    RETURN DATE_FORMAT(dt, f);
END

しかし、私はアクセントに問題があります:

SELECT DATE_FORMAT_FR('2000-02-01', '%a %W %b %M')
> Mar Mardi F?v F?vrier

どうすればこの問題を解決できますか?

4

1 に答える 1

0

ストアド プロシージャを phpMyAdmin UI で変更し、再検証するだけで、アクセントの問題が発生しないことがわかりました...とても奇妙です。

于 2012-12-21T11:41:57.217 に答える