sql >> Databáze >  >> RDS >> Mysql

mysql převést datum na stejné datum aktuálního roku

Khalidova odpověď je většinou správná. Přestupný rok věci zpacká! Pokud spustíte navrhovaný dotaz, kde hodnota datecol je '2016-02-29' a CURRENT_DATE je například '2017-01-01', dostanete null .

Alternativní způsob, jak toho dosáhnout, který zvládá přestupný rok elegantněji, je tento:

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

Hodnota date zde by bylo 2017-03-01.

Úprava/upřesnění:Problém je v tom, že například změnou roku '2016-02-29' na 2017 vznikne '2017-02-29', což není platné datum. Poté spuštěním DATE_FORMAT('2017-02-29', '%Y-%m-%d') výsledkem bude null . Ukázka problému je zde:

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

Po přezkoumání mé odpovědi jsem si však uvědomil, že mám další problém s použitím MAKEDATE, protože jakékoli datum v přestupném roce po 28. únoru je dny + 1 pro „normální“ rok s 365 dny. Pokud například datecol ='2016-03-01' a aktuální rok byl 2017, převedené datum by bylo '2017-03-02', nikoli '2017-03-01', jak je požadováno. Lepší přístup je následující:

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

Tato metoda změní jakýkoli 29. únor na 28. a jinak zachová všechna ostatní data přesně tak, jak byste je očekávali. Ukázka řešení je zde:

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



  1. Získejte celkový rekordní růst v průběhu času v mysql

  2. MySQL JOIN - Vraťte NULL pro duplicitní výsledky v levé tabulce

  3. Která pole řádku jsou vrácena při seskupování pomocí MySQL?

  4. Eager-Loading na základě prvního dotazu