sql >> Database teknologi >  >> RDS >> Mysql

mysql konverter dato til samme dato i det aktuelle år

Khalids svar er det meste af tiden rigtigt. Skudår roder tingene sammen! Hvis du kører den foreslåede forespørgsel, hvor værdien af ​​datecol er '2016-02-29' og CURRENT_DATE er '2017-01-01', for eksempel, får du null .

En alternativ måde at gøre dette på, der håndterer skudår mere yndefuldt, er sådan her:

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

Værdien af ​​date her ville være 2017-03-01.

Redigering/afklaring:Problemet er, at ændring af årstallet '2016-02-29' til 2017 f.eks. giver '2017-02-29', hvilket ikke er en gyldig dato. Kørsel af DATE_FORMAT('2017-02-29', '%Y-%m-%d') resulterer derefter i null . En demo af problemet er her:

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

Men efter at have gennemgået mit svar indså jeg, at jeg har et andet problem ved at bruge MAKEDATE, da enhver dato på et skudår efter 28. februar er dage+1 for et "normalt" år med 365 dage. For eksempel, hvis datecol ='2016-03-01' og det aktuelle år var 2017, ville den konverterede dato være '2017-03-02', ikke '2017-03-01' som ønsket. En bedre tilgang er som følger:

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

Denne metode forvandler enhver 29. februar til den 28. og holder ellers alle andre datoer nøjagtigt, som du ville forvente dem. En demo af løsningen er her:

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



  1. BESTIL EFTER ENUM-feltet i MYSQL

  2. MySQL og JDBC med rewriteBatchedStatements=true

  3. pip freeze giver forskellige moduler fra help('modules')

  4. JPA sammensat primær nøgle