2012-06-21 13 views
115

Mam tabeli bazy danych zawierającą daty„0000-00-00 00:00:00” nie może być reprezentowana jako błędu java.sql.Timestamp

(`date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'). 

Używam MySQL. Z programu czasami dane są przekazywane bez daty do bazy danych. Tak więc, wartość data jest automatycznie przypisany do 0000-00-00 00:00:00 gdy dane tabeli nazywa się z kolumny data to daje błąd

...'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp....... 

starałem się przekazać wartość zerową datą podczas wstawiania danych, ale robi się przypisać do Obecny czas.

Czy jest jakiś sposób mogę uzyskać ResultSet bez zmiany struktury tabeli

góry dzięki

Odpowiedz

234

Można użyć tego adresu URL JDBC bezpośrednio w konfiguracji źródła danych:

jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

+0

ciekawy. Czytając inne odpowiedzi, duh, nie ma miesiąca zero. Co to naprawdę oznacza? – Thufir

+15

powinno to być domyślne dla sterownika jdbc mysql. – bradvido

+0

Rozwiązałem mój problem. Dziękuję. –

0

Nie było roku 0000 i nie ma 00 miesięcy lub dni 00. Proponuję spróbować

0001-01-01 00:00:00 

O ile w niektórych standardach zdefiniowano rok 0, istnieje większe prawdopodobieństwo, że będzie on mylący niż użyteczne IMHO.

+2

Tak jest rok 0000. rzeczywiście jego rok 0, a mamy rok -1, a rok -1000. Nigdy nie widziałem tego [kalendarza gregoriańskiego] (https://en.wikipedia.org/wiki/Gregorian_calendar) lub tego [Anno Domini] (http://en.wikipedia.org/wiki/Before_Christ), a dokładniej kalendarza gregoriańskiego nie ma nie ma roku zerowego, ale iso ma i iso jest używane komputery bij patrz [0 rok] (http://en.wikipedia.org/wiki/0_ (rok)) – botenvouwer

+0

@sirwilliam Dziękuję za tę interesującą kwalifikację. Wydaje się, że PO chciał, aby rok 0 był traktowany jako NULL lub coś, co nie istnieje. –

+1

W MySQL 0000-00-00 00:00:00 jest równe 0. W starszej wersji kodu mogą występować pewne zapytania, na których się opiera. –

7

Zamiast używać fałszywych dat, takich jak 0000-00-00 00:00:00 lub 0001-01-01 00:00:00 (ta ostatnia powinna być akceptowana jako ważna data), zmień schemat bazy danych, aby umożliwić wartości NULL.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL 
+0

baza danych została mi dana. Nie mogę tego edytować. ale dzięki –

+0

Próbuję pozwolić na NULL, nie działa! –

1

zmagałem się z tym problemem i wdrożył rozwiązanie URL konkatenacji wniesionego przez @Kushan w przyjętym odpowiedzi powyżej. Działa w mojej lokalnej instancji MySql. Ale kiedy wdrożyłem moją aplikację Play/Scala do Heroku, nie będzie już działać. Heroku łączy również kilka argumentów z adresem URL bazy danych, które udostępniają użytkownikom, i tym rozwiązaniem, ponieważ Heraku używa konkatenacji "?" przed ich własnym zbiorem argumentów, nie zadziała. Jednak znalazłem inne rozwiązanie, które wydaje się działać równie dobrze.

kładę to w moich opisach stół i to rozwiązało problem „0000-00-00 00:00:00” nie może być reprezentowana jako java.sql.Timestamp

8

, czy nie „dzień” „0000-00-00" jest poprawnym«data»nie ma znaczenia dla kwestii .«Wystarczy zmienić bazę danych»rzadko jest dobrym rozwiązaniem

Fakty:.

  • MySQL AL obniża datę o wartości zer.
  • Ta "cecha" ma szerokie zastosowanie w innych językach.

Jeśli więc "po prostu zmienię bazę danych", tysiące linii kodu PHP ulegnie zniszczeniu.

Programiści w języku Java muszą zaakceptować datę zerową MySQL i, aby wprowadzić datę zerową z powrotem do bazy danych, gdy inne języki polegają na tej "funkcji".

Programista łączący się z MySQL musi obsługiwać wartości zerowe i 0000-00-00, a także ważne daty. Zmiana 0000-00-00 na wartość null nie jest realną opcją, ponieważ wtedy nie można już określić, czy data miała być 0000-00-00, aby można było wrócić do bazy danych.

Dla 0000-00-00 sugeruję sprawdzenie wartości daty jako łańcucha, a następnie zmianę na ("y", 1) lub ("rrrr-MM-dd", 0001-01-01), lub na jakąkolwiek niepoprawną datę MySQL (mniej niż rok 1000, iirc). MySQL ma inną "cechę": niskie daty są automatycznie konwertowane na 0000-00-00.

Zdaję sobie sprawę, że moja sugestia jest kludge. Ale podobnie jest z datowaniem MySQL. A dwa kłąby nie sprawiają, że to prawda. Faktem jest, że wielu programistów będzie musiało obsługiwać zerowe daty MySQL na zawsze.

5

Dołącz następujące oświadczenie JDBC-mysql protokole:

?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8 

na przykład:

jdbc:mysql://localhost/infra?zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8 
+1

Zachowaj ostrożność przy takim podejściu. Działa jak urok, ale zabrał na nas serwer produkcyjny (pracował doskonale w dev ...). Nauczyliśmy się, że będziesz musiał zacytować ciąg jako & jest interpretowany jako znak specjalny w niektórych kontekstach, nadając linii zupełnie innego znaczenia ... – Techmag

3

Jako exteme zmianę sytuacji, gdy nie można zrobić zmiany na datę kolumnie lub zaktualizować wartości lub podczas tych modyfikacji można dokonać wyboru za pomocą przypadku/kiedy.

SELECT CASE ModificationDate WHEN '0000-00-00 00:00:00' THEN '1970-01-01 01:00:00' ELSE ModificationDate END AS ModificationDate FROM Project WHERE projectId=1; 
0

prostu rzucić boiska char

np obsadą (updatedate) jako char jako updatedate

0

wiem, że to będzie późną odpowiedź, jednak tutaj jest najbardziej poprawna odpowiedź.

W bazie danych MySQL zmień domyślną wartość timestamp na CURRENT_TIMESTAMP. Jeśli masz stare rekordy z fałszywą wartością, będziesz musiał je ręcznie naprawić.

-1

Wierzę, że to pomaga w całości za które są coraz to poniższy wyjątek danych pompowania przez logstash Error: logstash.inputs.jdbc - wyjątek podczas wykonywania kwerendy JDBC {: exception => #}

Odpowiedź: jdbc: mysql: // localhost: 3306/database_name zeroDateTimeBehavior = convertToNull”

lub jeśli pracujesz z mysql

0

można usunąć "NULL" własność ze swojej kolumny w tabeli mysql, jeśli nie jest to konieczne?. po usunięciu właściwości "nie puste" nie ma potrzeby konwersji i proble "0000-00-00 00:00:00" m zniknęło.

Przynajmniej pracował dla mnie.

1

można spróbować like this

ArrayList<String> dtlst = new ArrayList<String>(); 
String qry1 = "select dt_tracker from gs"; 

Statement prepst = conn.createStatement(); 
ResultSet rst = prepst.executeQuery(qry1); 
while(rst.next()) 
{ 
    String dt = ""; 
    try 
    { 
     dt = rst.getDate("dt_tracker")+" "+rst.getTime("dt_tracker"); 
    } 
    catch(Exception e) 
    { 
     dt = "0000-00-00 00:00:00"; 
    } 

    dtlst.add(dt); 
} 
Powiązane problemy