Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql konvertiert das Datum in das gleiche Datum des laufenden Jahres

Khalids Antwort ist meistens richtig. Schaltjahr bringt alles durcheinander! Wenn Sie die vorgeschlagene Abfrage ausführen, bei der der Wert von datecol beispielsweise „2016-02-29“ und das CURRENT_DATE „2017-01-01“ ist, erhalten Sie null .

Ein alternativer Weg, um Schaltjahre eleganter zu handhaben, ist wie folgt:

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

Der Wert von date hier wäre 2017-03-01.

Bearbeiten/Klarstellung:Das Problem ist, dass das Ändern des Jahres von „2016-02-29“ in 2017 beispielsweise „2017-02-29“ ergibt, was kein gültiges Datum ist. Dann führt die Ausführung von DATE_FORMAT('2017-02-29', '%Y-%m-%d') zu null . Eine Demo des Problems finden Sie hier:

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

Nachdem ich meine Antwort überprüft hatte, stellte ich jedoch fest, dass ich ein weiteres Problem bei der Verwendung von MAKEDATE hatte, da jedes Datum in einem Schaltjahr nach dem 28. Februar Tage + 1 für ein "normales" Jahr mit 365 Tagen ist. Wenn beispielsweise datecol ='2016-03-01' und das aktuelle Jahr 2017 wäre, wäre das konvertierte Datum '2017-03-02', nicht wie gewünscht '2017-03-01'. Ein besserer Ansatz ist wie folgt:

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

Diese Methode verwandelt jeden 29. Februar in den 28. und behält ansonsten alle anderen Daten genau so bei, wie Sie es erwarten würden. Eine Demo der Lösung finden Sie hier:

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