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

mysql naprawić nieprawidłowe daty

Wygląda na to, że komunikat o błędzie pochodzi z klienta MySQL, a nie z serwera. Tak więc ustawienie trybu ścisłego serwera nie pomoże w wyświetlaniu tych dat dla tego klienta.

Wygląda na to, że masz w swoich danych daty w stylu 31.09.2012 lub 29.02.2013. Są poprawnie sformatowane, ale poza tym są błędne. W wersjach wcześniejszych niż 5.0.2 MySQL nie zostały one złapane poprawnie podczas wchodzenia do danych. Teraz twój serwer ustaw na ALLOW_INVALID_DATES nie knebluje ich, ale zamiast tego konwertuje je na „0000-00-00”. A klient się nimi gada.

Pierwszym krokiem do oczyszczenia tego jest zidentyfikowanie obraźliwych wierszy. Możesz tego spróbować.

Najpierw włącz ALLOW_INVALID_DATES

Następnie uruchom to zapytanie, aby rozejrzeć się po tabeli. Nie używaj SELECT *

  SELECT col,col,col,DATE_FORMAT(datecol,'%Y-%m-%d') 
    FROM mytable
   ORDER BY DATE_FORMAT(datecol,'%Y-%m-%d') 

Spróbuj dowiedzieć się z zestawu wyników, które daty są śmieciami. Mogą być umieszczone na pierwszym miejscu w tym oświadczeniu select, ale będziesz musiał trochę pogrzebać, aby je znaleźć.

Następnie zastanów się, jak chcesz je naprawić. Usunąć wiersze? Zmienić datę na 1941-12-07 (data, która żyje w niesławie)? Nie możemy Ci powiedzieć, co musisz tutaj zrobić.

Następnie napraw je. Jeśli jest tylko jeden lub dwa, napraw je jeden po drugim.

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE id='the id of the offending row.'

lub

  DELETE FROM mytable
        WHERE id='the id of the offending row.'

Jeśli jest ich tysiące, możesz je zbiorczo naprawić za pomocą czegoś takiego. Ale nie rób tego bez uprzedniego bardzo dokładnego przeanalizowania problemu na serwerze testowym. Jeśli popełnisz błąd, zniszczysz swój stół.

  UPDATE mytable
     SET datecol='whatever replacement date'
   WHERE '0000-00-00' = DATE_FORMAT(datecol,'%Y-%m-%d')

Po zakończeniu rozwiązywania problemów wróć i wykonaj SELECT * , aby upewnić się, że masz je wszystkie.

Następnie wyłącz ALLOW_INVALID_DATES i nigdy nie włączaj go ponownie.

To powinno posprzątać bałagan. Zwróć uwagę, że dane ze świata rzeczywistego zawsze zawierają niektóre wiersze, które nie są w nich idealne.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wybierz zestawienie z wielu tabel ze zmiennymi danymi wejściowymi

  2. Hash hasła i solenie – czy to dobra metoda?

  3. MySql select IN ciąg klauzuli rozdzielany przecinkami

  4. Poprawne zaimplementowanie podtypu super-type w MySQL

  5. MySQL — zaznacz wszystko oprócz tego, co znajduje się w tej tabeli