Mam tabelę bazy danych zawierającą daty
(`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00').
Używam MySQL. Z programu czasami dane są przekazywane do bazy danych bez daty. Tak więc wartość daty jest automatycznie przypisywana, 0000-00-00 00:00:00
gdy wywoływana jest tabela danych z kolumną daty, w której występuje błąd
...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp.......
Próbowałem przekazać wartość null do daty podczas wstawiania danych, ale zostaje ona przypisana do aktualnego czasu.
Czy jest jakiś sposób, aby uzyskać to ResultSet
bez zmiany struktury tabeli?
To, czy „data” „0000-00-00” jest prawidłową „datą”, nie ma znaczenia dla pytania. „Po prostu zmień bazę danych” rzadko jest dobrym rozwiązaniem.
Fakty:
Tak więc, jeśli „po prostu zmienię bazę danych”, tysiące linii kodu PHP zostanie przerwanych.
Programiści Java muszą zaakceptować datę zerową MySQL i muszą umieścić datę zerową z powrotem w bazie danych, gdy inne języki polegają na tej „funkcji”.
Programista łączący się z MySQL musi obsługiwać wartości null i 0000-00-00 oraz prawidłowe daty. Zmiana 0000-00-00 na null nie jest realną opcją, ponieważ wtedy nie można już określić, czy oczekiwana data to 0000-00-00 do zapisu z powrotem do bazy danych.
W przypadku 0000-00-00 proponuję sprawdzić wartość daty jako ciąg znaków, a następnie zmienić ją na („y”, 1) lub („yyyy-MM-dd”, 0001-01-01) lub na dowolny nieprawidłowy Data MySQL (mniej niż rok 1000, iirc). MySQL ma jeszcze jedną „funkcję”: niskie daty są automatycznie konwertowane na 0000-00-00.
Zdaję sobie sprawę, że moja sugestia jest niezdarna. Ale tak samo jest z obsługą dat w MySQL. A dwa bzdury nie pomagają. Faktem jest, że wielu programistów będzie musiało wiecznie obsługiwać daty zerowe MySQL .
źródło
Dołącz następującą instrukcję do protokołu JDBC-mysql:
na przykład:
źródło
Zamiast używać fałszywych dat, takich jak
0000-00-00 00:00:00
lub0001-01-01 00:00:00
(ta ostatnia powinna zostać zaakceptowana, ponieważ jest prawidłowa), zmień schemat bazy danych, aby zezwolić naNULL
wartości.źródło
W ostatecznym rozrachunku, kiedy nie możesz zmienić kolumny z datą lub zaktualizować wartości, lub gdy mają miejsce te modyfikacje, możesz dokonać wyboru przy użyciu przypadku / kiedy.
źródło
Zmagałem się z tym problemem i wdrożyłem rozwiązanie do konkatenacji adresów URL dostarczone przez @Kushan w zaakceptowanej odpowiedzi powyżej. Zadziałało w mojej lokalnej instancji MySql. Ale kiedy wdrożyłem aplikację Play / Scala na Heroku, przestała ona działać. Heroku łączy również kilka argumentów z adresem URL bazy danych, które dostarczają użytkownikom, oraz to rozwiązanie, ponieważ Heroku używa konkatenacji „?” przed ich własnym zestawem argumentów, nie zadziała. Jednak znalazłem inne rozwiązanie, które wydaje się działać równie dobrze.
Umieściłem to w moich opisach tabel i rozwiązałem problem „0000-00-00 00:00:00”, którego nie można przedstawić jako java.sql.
źródło
możesz spróbować w ten sposób
źródło
Nie było roku 0000 i nie ma miesiąca 00 ani dnia 00. Proponuję spróbować
Chociaż w niektórych standardach zdefiniowano rok 0, jest bardziej prawdopodobne, że będzie on zagmatwany niż przydatna IMHO.
źródło
po prostu rzuć pole jako char
Np .: cast (updatedate) jako char as updatedate
źródło
Wiem, że to będzie późna odpowiedź, ale tutaj jest najbardziej poprawna odpowiedź.
W bazie danych MySQL zmień
timestamp
domyślną wartość naCURRENT_TIMESTAMP
. Jeśli masz stare rekordy z fałszywą wartością, będziesz musiał ręcznie je naprawić.źródło
Jeśli nie jest to konieczne, możesz usunąć właściwość „not null” z kolumny w tabeli mysql. po usunięciu właściwości „not null” nie ma potrzeby konwersji „0000-00-00 00:00:00” i problem zniknie.
Przynajmniej pracował dla mnie.
źródło
Uważam, że jest to pełna pomoc dla tych, którzy otrzymują to poniżej Wyjątek dotyczący pompowania danych przez logstash Błąd: logstash.inputs.jdbc - wyjątek podczas wykonywania zapytania JDBC {: wyjątek => #}
Odpowiedź: jdbc: mysql: // localhost: 3306 / database_name? ZeroDateTimeBehavior = convertToNull "
lub jeśli pracujesz z mysql
źródło