Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql konwertuje datę na tę samą datę bieżącego roku

Odpowiedź Khalida jest przez większość czasu poprawna. Rok przestępny psuje wszystko! Jeśli uruchomisz proponowane zapytanie, w którym wartość datecol to „2016-02-29”, a CURRENT_DATE to „2017-01-01”, na przykład otrzymasz null .

Inny sposób na zrobienie tego, który lepiej radzi sobie z rokiem przestępnym, jest następujący:

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

Wartość date tutaj byłby 01.03.2017.

Edycja/wyjaśnienie:Problem polega na tym, że zmiana roku „2016-02-29” na 2017, na przykład, daje „2017-02-29”, co nie jest prawidłową datą. Następnie uruchomienie DATE_FORMAT('2017-02-29', '%Y-%m-%d') daje wynik null . Prezentacja problemu jest tutaj:

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

Jednak po przejrzeniu mojej odpowiedzi zdałem sobie sprawę, że mam kolejny problem, używając MAKEDATE, ponieważ dowolna data w roku przestępnym po 28 lutego to dni + 1 dla „normalnego” roku z 365 dniami. Na przykład, jeśli datecol =„2016-03-01”, a bieżący rok to 2017, przekonwertowana data będzie miała wartość „2017-03-02”, a nie „2017-03-01”, zgodnie z wymaganiami. Lepsze podejście jest następujące:

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

Ta metoda zamienia dowolny 29 lutego na 28, a poza tym zachowuje wszystkie inne daty dokładnie tak, jak można by się tego spodziewać. Demo rozwiązania jest tutaj:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python:najlepsze praktyki i najbezpieczniejszy sposób łączenia się z MySQL i wykonywania zapytań

  2. JDBC podaje datę i godzinę MySQL w UTC

  3. Jak zainstalować i używać MySQLdb dla Pythona 3 w systemie Windows 10?

  4. Silnik tabeli wymiany Mysql MyISAM na InnoDB

  5. Null EntityManager przy użyciu @PersistenceContext