Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql convertit la date à la même date de l'année en cours

La réponse de Khalid est correcte la plupart du temps. Les années bissextiles gâchent les choses ! Si vous exécutez la requête proposée où la valeur de datecol est '2016-02-29' et le CURRENT_DATE est '2017-01-01', par exemple, vous obtenez null .

Une autre façon de faire cela qui gère les années bissextiles plus gracieusement est la suivante :

SELECT DATE_FORMAT(
    MAKEDATE(YEAR(CURRENT_DATE()), DAYOFYEAR(datecol)),
    '%Y-%m-%d'
) `date`
FROM t

La valeur de date ici serait 2017-03-01.

Modification/clarification :le problème est que le changement de l'année de '2016-02-29' en 2017, par exemple, produit '2017-02-29', qui n'est pas une date valide. Ensuite, l'exécution de DATE_FORMAT('2017-02-29', '%Y-%m-%d') donne null . Une démo du problème est ici :

http://sqlfiddle.com/#!9/c5358/11

Cependant, après avoir examiné ma réponse, j'ai réalisé que j'avais un autre problème en utilisant MAKEDATE car toute date d'une année bissextile après le 28 février correspond à jours + 1 pour une année "normale" de 365 jours. Par exemple, si datecol ='2016-03-01' et que l'année en cours était 2017, la date convertie serait '2017-03-02', et non '2017-03-01' comme souhaité. Une meilleure approche est la suivante :

SELECT
DATE_FORMAT(DATE_ADD(datecol, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(datecol)) YEAR), '%Y-%m-%d') `date`
FROM t;

Cette méthode transforme n'importe quel 29 février en 28 et conserve toutes les autres dates exactement comme vous vous y attendiez. Une démo de la solution est ici :

http://sqlfiddle.com/#!9/c5358/12