Wert '0000-00-00 00:00:00' in Datenbank vorhanden

Einklang.

Bekanntes Mitglied
Hallo,

bekomme folgende Fehlermeldung:

Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
weil in der Datenbank von der ich den Wert abhole genau dieser Wert schon drin steht.

Es handelt sich also explizit NICHT um ein neu auftretendes Problem der Netzwerkverbindung, worauf hier hingewiesen wurde: http://www.java-forum.org/datenbankprogrammierung/139671-java-sql-exception-getdate.html

Was kann ich machen, wenn dieser Wert also schon in der Datenbank als Wert drin steht, übrigens bei mehreren Datensätzen?
Habe schon versucht den Wert bzw die "0" in der Variable dann durch "1" zu ersetzen aber hat nicht funktioniert.

Die original Fehlermeldung ist
Java:
SQL-Exception bei der Abfrage: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp


besten Dank
 
Evtl. solltest du deine Datentypen in "Einklang" 😉 bringen... Das was du da hast ist jedenfalls ein SQL-Date und kein SQL-Timestamp. Der Unterschied: SQL-Date ist mehr oder weniger ein besonders formatierter String während SQL-Timestamp eine Zahl (afaik die Anzahl der vergangenen Sekunden seit 1.1.1970) ist.
 
Man programmiert. Man fängt die Exception, prüft was für ein Wert kommt, wandelt ihn um und arbeitet weiter.
 
Das was du da hast ist jedenfalls ein SQL-Date und kein SQL-Timestamp. Der Unterschied: SQL-Date ist mehr oder weniger ein besonders formatierter String während SQL-Timestamp eine Zahl (afaik die Anzahl der vergangenen Sekunden seit 1.1.1970) ist.
Das ist falsch. SQL-Timestamp sowie SQL-Datetime haben normalerweise das (String-)Format "YYYY-MM-DD HH:MM:SS". SQL-Date wäre "YYYY-MM-DD". Ich vermute, die DB beschwert sich darüber, dass es den Nullten Nullten Nullhundertnullundnullzig nicht gibt.
 
er kopiert hier DB-Tabellen - jedenfalls ist das aus den anderen Thread ersichtlich. Offenbar sind die Tabellen aus irgendeinem Grund nicht immer korrekt befüllt. Was würdest du tun um den Fehler zu beheben. Gerade wenn du kein Zugriff auf die Quelltabellen hast. Ignoriren?
 
Das ist falsch. SQL-Timestamp sowie SQL-Datetime haben normalerweise das (String-)Format "YYYY-MM-DD HH:MM:SS". SQL-Date wäre "YYYY-MM-DD". Ich vermute, die DB beschwert sich darüber, dass es den Nullten Nullten Nullhundertnullundnullzig nicht gibt.
Öhm... Okay, da hab' ich wohl was verpasst oder verwechselt. 😳 Aber wie auch immer - DATE, DATETIME und TIMESTAMP haben zumindest nicht dieselben Wertebereiche (hier nachzulesen). Werte verschiedener Datentypen können deswegen nicht immer erfolgreich gewandelt oder überführt werden.
@TO: Warum verwendest du also nicht den Datentyp, den die Original-Datenbank an der Stelle auch verwendet?
@qw1232w: Ach so ist das... wer kann den so etwas ahnen. Naja... Ich würd' in diesem Fall erst dann weiter machen, wenn die Exception behoben wurde, also z.B. nach dem der passende Datentyp in der Datenbank-Kopie steht.
 
Zuletzt bearbeitet von einem Moderator:
Ah toll soviele Antworten! ;-)

Also DAtentyp ist datetime - dass das wie ein String gilt bzw als String gilt ist interessant dann muss ich da was ändern im Programm - weil alle Strings ja Anführungszeichen im SQL Statement bekommen....!

@TO: Warum verwendest du also nicht den Datentyp, den die Original-Datenbank an der Stelle auch verwendet?

Ja eigentlich verwende ich den gleichen Datentyp.... ich kopiere die Tabellen ja 1:1 mit Datentyp! Auch rufe ich nur die Daten von der lokalen Datenbank ab, um sie dann von dem Server auszulesen (tabellennamen, spaltennamen, datentyp usw von der lokalen Datenbank und diese werden dann in der Serverdatenbank gesucht und ausgelesen). Ich lese also alle vorhanden Tabellen und deren Spalten lokal ab, um dann die Daten von den Tabellen auf dem Server auszulesen. Denn wenn sich in der Datenbank auf dem Server was ändert/erweitert, bleibt das Programm davon unberührt bzw werde ich das mit ner anderen Funktion dann organisieren.

Anführungszeichen bei datetime hat nichts gebracht! ;-)
 
Zuletzt bearbeitet:
Joa wie hier: Using Prepared Statements (The Java™ Tutorials > JDBC(TM) Database Access > JDBC Basics)

Aber das ist mir etwas zu komplex momentan.... da ich nicht weiß wo bzw was ich damit anfangen soll in meinem Fall.....!
Wenn es gar nicht anders geht dann muss es wohl sein...!

Naja also ich hab meinen Code mal untersucht und es ist so:
Sobald Java den Wert datetime mit Nullen in eine Variable aus dem ResultSet ausliest kommt die Fehlermeldung:
Java:
spvalue = serdbaberg.getString(i);
(in einer for-schleife die alle spalten durchgeht, wobei "i" immer die aktuelle spalte ist) - serdbaberg ist das ResultSet!
Hier wird also spvalue zu dem ungültigen dateformat mit Nullen, worauf dann die Exception folgt!

Da wird es wohl nichts anderes als die prepared statements geben, denn wie ich einen Wert bearbeiten sollte wenn er nicht einmal auszulesen ist.....
 
Wenn ich ein Datum aus einem ResultSet lesen will, rufe ich [c]getTimeStamp()[/c] auf und nicht getString(). Probier's mal damit. (Prepared Statements sind aber weiterhin die beste Lösung).
 
Also bei mir kommt da ne Fehlermeldung: "The method getTimeStamp(int) is undefined for the type ResultSet"

Muss ich doch schauen wie das nun mit den prepared statements geht.... dabei hätte es jetzt fast geklappt... ;-)
 
Ein schneller Blick in die API (was du bestimmt auch hingekriegt hättest) sagt mir, man muss es einfach nur richtig schreiben:
Java:
getTimestamp(int columnIndex)

Aber auch ich kann PreparedStatements nur empfehlen. Das verhindert schonmal ziemlich viele Fehlermöglichkeiten...
 
Zuletzt bearbeitet von einem Moderator:
hmm ne daran lags nicht bzw kommt die gleiche Meldung:

Multiple markers at this line
- Syntax error on token "int", delete this token
- The method getTimeStamp(int) is undefined for the type
ResultSet

bei folgendem Code:

Java:
if(spalttype=="datetime") {
							spvalue = serdbaberg.getTimeStamp(int i);
						}
						else {
							spvalue = serdbaberg.getString(i);
						}
 
The method getTimeStamp(int) is undefined for the type

Du hast es immer noch falsch geschrieben... MErkst du den Unterschied:
Code:
getTimeStamp(int)
und
Code:
getTimestamp(int)
 
Anstatt
Java:
spvalue = serdbaberg.getTimeStamp(int i);
musst du
Java:
spvalue = serdbaberg.getTimestamp(i);
schreiben.

Also in der Klammer das int weglassen und dafür ne Zahl (Spaltenindex). Das int steht nur da, damit man weiss, was für ein Datentyp da hingehört.

Aber die Fehlermeldung sagt ja schon ziemlich viel aus:
Multiple markers at this line
- Syntax error on token "int", delete this token
- The method getTimeStamp(int) is undefined for the type
ResultSet

1.) Das Wort
Code:
int
gehört da nicht hin und sollte gelöscht werden
2.) Der Typ ResultSet kennt keine Methode namens getTimeStamp(int)

Da muss mun dann einfach mal in die Doku der API schauen, ob es die Methode gibt und wie man die richtig schreibt. Da steht dann auch, welche Parameter es gibt, also wie die Methode aufgerufen werden kann. Manchmal gibt es dafür mehrere Möglichkeiten.
 
Zuletzt bearbeitet von einem Moderator:
Ok jetzt bin ich bei folgendem Code:

Java:
toll = serdbaberg.getTimestamp(i);
(Initialisierung usw mit " Timestamp toll = null;")

und erhalte folgende Fehlermeldung:

Multiple markers at this line
- Line breakpoint:ButtonDBTablezweite [line: 793] - methodetabellenfuellen()
- Type mismatch: cannot convert from Timestamp to String
- Type mismatch: cannot convert from java.sql.Timestamp to
java.security.Timestamp

ist wieder so ne Problemstelle... ;-)

Danke
 
Zuletzt bearbeitet:
Was könnten denn diese beiden Fehlermeldungen bedeuten?
- Type mismatch: cannot convert from Timestamp to String
- Type mismatch: cannot convert from java.sql.Timestamp to
java.security.Timestamp

1.) Du versuchst (vermutlich nicht richtig) den geholten Timestamp in einen String umzuwandeln.
2.) Du hast wahrscheinlich ein falsches import (java.security.Timestamp anstatt java.sql.Timestamp) für die gewünschte Klasse Timestamp gesetzt. Da musst du aufpassen, weil es manchmal verschiedene Klassen mit dem gleichen Namen gibt, aber in unterschiedlichen Packages. Einfach schauen, wo das so ist und ins richtige Package umschreiben.
 
Aaaalso ich hab jetzt keine Fehlermeldungen mehr undzwar hab ich folgendes gemacht:

Java:
java.sql.Timestamp toll = null;
Als import-Anweisung bekomm ich FEhlermeldungen beim "date" Format daher hab ich das gleich mal gelassen... ;-)!

und weiter unten dann
Java:
if(spalttype=="datetime") {
							toll = serdbaberg.getTimestamp(i);
						}
						else {
							spvalue = serdbaberg.getString(i);
						}

Jetzt muss ich noch schauen wie ich das Format Timestamp in String umwandel und dann kann ich schauen ob es so verarbeitet wird.....

besten Dank
 
Okay irgendwie find ich keine Lösung dafür - hat hier jemand was um Timestamp in String zu parsen oder sonstwie umzuwandeln?

Ich hab also jetzt folgendes:

Java:
toll = serdbaberg.getTimestamp(i);

und die Variable toll soll nun in einen String gewandelt werden bzw. der Inhalt......! ;-)

besten Dank
 
OK, mal schauen, ob ich das hinkriege. Soweit ich weiss, geht das über ein GregorianCalendar und mit SimpleDateFormat. Falls Fehler oder Verbesserungsvorschläge, wird sich bestimmt eh gleich nochmal jemand melden.

Java:
// Timestamp aus ResultSet (serdbaberg) holen
Timestamp sqlTimestamp = serdbaberg.getTimestamp(i);

// Timestamp in GregorianCalendar umwandeln
GregorianCalendar gc = new GregorianCalendar();
gc.setTime(sqlTimestamp);

// SimpleDateFormat festlegen (für die Formatierungsmöglichkeiten in
// der Klammer musst du nochmal nachschauen und deine gewünschten
// Formatierungen dort eintragen)
SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy  HH:mm");

// GregorianCalendar in String umformatieren
String myString = sdf.format(gc.getTime());
 
Würde das nicht in Zeile 2 eine Exception geben wenn man versucht den Wert '0000-00-00 00:00:00' in einen Timestamp zu schreiben, der eben diesen nicht aufnehmen kann, da es den 0ten 0ten Jahr 0000 gar nicht gibt?

Das ist doch das ursprüngliche Problem 😉
 
Zuletzt bearbeitet:
Ja, du hast recht. Hatte das Ausgangsposting schon wieder vergessen...
(Hee, wo ist dein Homer-Avatar hin?)
 
OK, hab noch mal nachrecherchiert und zwei Lösungsmöglichkeiten gefunden:

1.) Die DB-URL anzupassen:
Code:
jdbc:mysql://yourserver:3306/yourdatabase?zeroDateTimeBehavior=convertToNull

2.) Die Datenbankstruktur zu ändern und für die Spalte mit dem Timestamp auch null zuzulassen.
 
(Hee, wo ist dein Homer-Avatar hin?)

Der hat ausgedient 😀
War nur schon länger nicht mehr hier im Forum ... nun kommt der Joker zum Zug :toll:

@Einklang.
Was für eine DB ist das eigentlich?
Evtl. kann man bei der SQL-Abfrage ja schon die Konvertierung vornehmen so das ein String von der DB geliefert wird.
Beispiel MS SQL CONVERT:
SQL:
-- liefert: yyyy-mm-dd hh:mi:ss
CONVERT(nvarchar(19), deinTimestamp, 120)

-- liefert deutsches Format: dd.mm.yyyy hh:mi:ss
CONVERT(nvarchar(10), deinTimestamp, 104) + N' ' + CONVERT(nvarchar(8), deinTimestamp, 108)

-- liefert: dd MM yyyy hh:mm:ss:mmm
CONVERT(nvarchar(10), deinTimestamp, 113)

Bin bei anderen DBs nicht so firm, aber dort gibts auf jeden Fall entsprechende Konvertierungsmöglichkeiten
 
Zuletzt bearbeitet:
Das du da jetzt plötzlich was mit String versuchst, könnte an meiner Verwechslung liegen. Aber immerhin solltest du die Datentypen per "toString()"-Methode in solche wandeln können. Mit Strings könnten sich dann evtl. auch die Wertebereiche anpassen lassen, sofern es doch nicht die gleichen Datentypen sind. Ich denke aber, dass es vollkommen ausreicht, wie oben bereits gesagt, in der Zieldatenbank NULL-Werte zu erlauben. Denn wenn es die selben Datentypen sind, muss nichts angepasst werden. Deine QuellDB müsste an dieser Stelle theoretisch auch NULL-Werte erlauben, weil es sonst keine Erklärung dafür gäbe, wie solche dort rein kommen. Erlaubt die Zieldatenbank stattdessen an dieser Stelle keine NULL-Werte, ist's keine 1:1-Kopie.
 
Du solltest wohl doch einmal das Problem genauer beschreiben

Was hast du mit den Werten vor? Auslesen? Wegschreiben?
Was für eine DB?
Kannst du DB-Eigenschaften ändern?

usw.
 
Ah super soviel Antworten schon! ;-)

Ok also ich versuche momentan DAten von einer MySql Datenbank auf einem Server in eine MySql Datenbank auf meinem PC zu kopieren bzw. zu schreiben.

Bei dem Datentyp datetime kommt die Fehlermeldung mit den 0en!
Der Fehler tritt an der Stelle auf, an der der Wert vom ResultSet in eine Variable ausgelesen werden soll (siehe oben)!
Das Problem ist, dass die Nullwerte im Datum/Zeitformat nicht entstehen bei der ÜBertragung, sondern schon so als Werte in der Datenbank drin stehen!

Grundsätzlich sind (müssten) die Servertabelle und die lokale Tabelle einheitlich sein, auch im Datentyp!
 
Dann gibt es also keinen Grund, einen Timestamp in einen String zu verwandeln. Lies einfach das Timestamp-Objekt aus der einen DB ein, und schreibe es unverändert in die andere DB -- jeweils über Prepared Statements.
 
Grundsätzlich sind (müssten) die Servertabelle und die lokale Tabelle einheitlich sein, auch im Datentyp!
...nun, dass sind sie eben nicht.
Oder deine Problembeschreibung ist alles andere als schlüssig. Ich zitiere mal aus dem ersten Post:
Die original Fehlermeldung ist
Java:
SQL-Exception bei der Abfrage: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
Diese Fehlermeldung sagt eindeutig, dass diese "Value", welche im Prinzip jedwede Stringdarstellung eines beliebigen Datentyps (in etwa Date oder DateTime) sein kann, jedoch keinesfalls Timestamp, weil diese Stringrepresentation in diesen nicht rein passt (Wertebereich). In deinem letzten Post aber sprichst du davon, dass die Fehlermeldung beim Datentyp "Datetime" kommt. Die logische Schlussfolgerung ist also, dass deine Datenbanken keineswegs 1:1-Kopien sind. Datetime gelesen und ZielDB hat an dieser Stelle Timestamp. Natürlich kracht das... früher oder später.
 
Naja es ist ja auch so dass ich extra die Tabellen und Spalten von der lokalen DB abfrage und diese dann auf dem Server abrufe... also da kann auch nix verschoben sein! Er ruft auch wirklich die Daten aus der richtigen Tabelle/Spalte ab- nur da steht eben der Datentyp datetime drin mit den 0-Werten..... ich hab das auch direkt per Serverzugriff über den Hoster nachgesehen, das stimmt schon so! Das Programm will einfach nicht die Nullwerte auslesen sozusagen bis jetzt macht es ja mit Timestamp - jetzt muss ich eben sehen wie ich das nun weiterverarbeitet bekomm....!

Also evtl noch folgendes:

momentan wird noch gar nichts in die lokale Festplatte reingeschrieben - die Fehlermeldung erscheint ausschließlich vom auslesen der Serverdatenbank!
Die Variable spvalue ist immer String, hat bisher nie Probleme gemacht - allerdings kam mir jetzt, dass JAva ja meistens die Datenprobleme selber parst (oder so ähnlich) und jedenfalls noch in Ordnung bringt (daher funktionieren int usw), evtl bei Timestamp nicht mehr und daher die Fehlermeldung....!

Also warum Timestamp nach String - weil ich bisher alle DAtentypen so behandelt habe und der Wert einfach nur zum Auslesen ist, ob noch Hochkomma hinzukommen! Aber momentan versteh ichs selber nicht mehr so ganz ;-)!
Muss nochmal reinschauen was nun Sache ist und die neuen Informationen hier mit reindenken.....!

Bzw ist es so:

Java:
if(spalttype=="datetime") {
							toll = serdbaberg.getTimestamp(i);
							
									
						}
						else {
							spvalue = serdbaberg.getString(i);
						}

Bisher haben alle DAtentypen (int usw) mit spvalue (String) funktioniert - daher meine Idee dass ich den Wert von toll in spvalue reinbringen muss.... und schon ist wieder alles wie es sein sollte! :-D
 
Zuletzt bearbeitet:
Lesen tut das Programm die Null-Werte schon, nur ein entsprechendes Typecast von Datetime (gelesen) nach Timestamp (gefordert) schlägt fehl. Ich würde die beiden Datenbanken evtl. mal mit MySQLDumper oder PHPMyAdmin ansehen und vergleichen. Date, Datetime und Timestamp sind in SQL nun mal inkompatible Datentypen, mit anderen Worten: Datetime (Server) != Timestamp (lokal). Wenn du die ServerDB nicht ändern kannst, musst du deine lokale DB dahingehend ändern oder dir 'nen Wolf konvertieren.
 
Vom SQL Statement her ist es ja so:
SQL INSERT INTO Statement

Später wird dann eingefügt in der Art:
Java:
("Insert into tabelle "+spvalue)........

Bedeutet, dass es im Grunde egal sein müsste, welcher Datentyp die Variable spvalue ist, in der der Wert in java steht? Außer für Strings (char, varchar usw), die noch ein Hochkomma brauchen.....!

Daher könnte oder müsste eine Lösung sein, die Timestamp Variable in einen String umzuwandeln und in die Variable spvalue zu schreiben...........???
(sie in das SQL STatement in Abwechslung mit spvalue für alle anderen Datentypen wäre wohl komplizierter...)
 
Ja, da sollte klappen die Stringvariante des Timestamps in die Tabelle einzufügen.

Sauberer ist es die Spalten der Tabelle explizit anzugeben, damit auch alles da landet wo es hin soll.
SQL:
INSERT INTO Tabelle(SpaltenName1, SpaltenName2, SpaltenName3, SpaltenName4)
VALUES(wert1, wert2, wert3, 'wert4')
So bekommst du auch mit evtl. vorhandenen Spalten die Identity-Werte* haben keine Schwierigkeiten, da du diese auslassen kannst.

*Spalten mit Identity-Werten zählen ihren Inhalt automatisch bei einfügen eines neuen Datensatzes um eine bestimmte Schrittweite hoch. Werden oft für PrimaryKeys verwendet und können vom außen nicht manipuliert werden.
 
Zuletzt bearbeitet:
Super klingt mal nach ner Aussicht - bleibt die Frage wie ich die Timestamp Variable in String umwandle.... 🙂!

Ich probiers mal mit
Java:
spvalue = toll.toString()

Danke
 
Gerade alles ausprobiert und es geht nicht als Timestamp!!

Hier die Fehlermeldung
SQL-Exception bei der Abfrage: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

Kommt genau bei diesem Befehl:
Java:
toll = serdbaberg.getTimestamp(i);

Interessanterweise geht er auch in diese Abfrage hinein: (es ist also wirklcih das datetime Datentyp )
Java:
if(spalttype.equalsIgnoreCase("datetime")) {
							toll = serdbaberg.getTimestamp(i);
							spvalue = toll.toString();
									
						}
						else {
							spvalue = serdbaberg.getString(i);
						}


Ok also Timestamp geht wohl nicht, was nehme ich da für datetime?

Aalso ich hab jetzt folgenden Code ausprobiert:
Java:
toll = serdbaberg.getDate(i);
Jetzt kommt wieder folgende Fehlermeldung:
Type mismatch: cannot convert from Date to Timestamp
Ok Date funktioniert an sich, wirft aber den gleichen SQL-Exception wie Timestamp:
Value '0000-00-00 00:00:00' can not be represented as java.sql.Date
 
Zuletzt bearbeitet:
Java:
if(spalttype.equalsIgnoreCase("datetime")) {
							toll = serdbaberg.getTimestamp(i);
							spvalue = toll.toString();
									
						}
						else {
							spvalue = serdbaberg.getString(i);
						}
Bei so was stellen sich meine Nackenhaare auf. 😉 Wieso als Datentyp "dateime" abfragen, um dann "timestamp" zu lesen? Versuch's mal mit
Java:
if(spalttype.equalsIgnoreCase("timestamp")) {
							toll = serdbaberg.getTimestamp(i);
							spvalue = toll.toString();
									
						}
						else {
							spvalue = serdbaberg.getString(i);
						}
 
Ok habe nun zeroDateTimeBehavior an die Verbindung drangehängt wie hier vorgestellt:

MySQL Bugs: #13261: zeroDateTimeBehavior property seems to be ignored

Jetzt kommen andere Fehlermeldungen, die ich dann heute Vormittag in Angriff nehme - sind aber schon bekanntere Fehlermeldungen! ;-)

Jedenfalls scheint, also scheint, zu funktionieren.... ;-)

Nachtrag weil jetzt erst gesehen: datetime wwird abgefragt weil es als Datentyp angezeigt wird....! Timestamp kommt ja erst aus dieser Diskussion hier.... und ich hab auch wieder geändert in Date!

Java:
if(spalttype.equalsIgnoreCase("datetime")) {
							// toll = serdbaberg.getTimestamp(i);
							toll = serdbaberg.getDate(i);
							// spvalue = toll.toString();
									
						}

Wirft jetzt die Fehlermeldung, dass der Column Index out of Range - das denk ich bekomm ich hin! ;-)

Dann seh ich weiter ob jetzt so alles passt - aber die Umwandlung sollt noch mit rein in String - mal sehen ;-)! Morgen gehts dann weiter :-D

Danke
 
Zuletzt bearbeitet:

Zurück
Oben