'0000-00-00 00:00:00' kann nicht als java.sql.Timestamp-Fehler dargestellt werden


141

Ich habe eine Datenbanktabelle mit Datumsangaben

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

Ich benutze MySQL. Vom Programm werden manchmal Daten ohne Datum an die Datenbank übergeben. Daher wird der Datumswert automatisch zugewiesen, 0000-00-00 00:00:00 wenn die Tabellendaten mit der Datumsspalte aufgerufen werden, in der ein Fehler auftritt

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

Ich habe versucht, beim Einfügen von Daten einen Nullwert an das Datum zu übergeben, dieser wird jedoch der aktuellen Uhrzeit zugewiesen.

Gibt es eine Möglichkeit, die zu erhalten, ResultSetohne die Tabellenstruktur zu ändern?

Antworten:


302

Sie können diese JDBC-URL direkt in Ihrer Datenquellenkonfiguration verwenden:

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


2
neugierig. Lesen Sie die anderen Antworten, duh, es gibt keinen Monat Null. Was bedeutet das wirklich?
Thufir

2
Wissen Sie, ob es ein MariaDB-Äquivalent zum Anhängen an meine JDBC-URL gibt? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull scheint bei mir nicht zu funktionieren.
Jeffkempf

Musste für mich CONVERT_TO_NULL sein
routeburn

16

Ob das "Datum" '0000-00-00 "ein gültiges" Datum "ist oder nicht, ist für die Frage irrelevant." Nur die Datenbank ändern "ist selten eine praktikable Lösung.

Fakten:

  • MySQL erlaubt ein Datum mit dem Wert Nullen.
  • Diese "Funktion" wird häufig in anderen Sprachen verwendet.

Wenn ich also "nur die Datenbank ändere", werden Tausende von Zeilen PHP-Code unterbrochen.

Java-Programmierer müssen das MySQL-Nulldatum akzeptieren und ein Nulldatum wieder in die Datenbank aufnehmen, wenn andere Sprachen auf diese "Funktion" angewiesen sind.

Ein Programmierer, der eine Verbindung zu MySQL herstellt, muss null und 0000-00-00 sowie gültige Daten verarbeiten. Das Ändern von 0000-00-00 in null ist keine praktikable Option, da Sie dann nicht mehr feststellen können, ob das Datum für das Zurückschreiben in die Datenbank voraussichtlich 0000-00-00 war.

Für 0000-00-00 empfehle ich, den Datumswert als Zeichenfolge zu überprüfen und ihn dann in ("y", 1) oder ("yyyy-MM-dd", 0001-01-01) oder in einen ungültigen Wert zu ändern MySQL-Datum (weniger als 1000 Jahre, iirc). MySQL hat eine weitere "Funktion": Niedrige Daten werden automatisch in 0000-00-00 konvertiert.

Mir ist klar, dass mein Vorschlag ein Kludge ist. Aber auch die Datumsverarbeitung von MySQL. Und zwei Kludges machen es nicht richtig. Tatsache ist, dass viele Programmierer MySQL-Nulldaten für immer verarbeiten müssen .


9

Fügen Sie die folgende Anweisung an das JDBC-mysql-Protokoll an:

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

beispielsweise:

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

5
Seien Sie vorsichtig mit diesem Ansatz. Es funktioniert wie ein Zauber, aber es hat einen Produktionsserver auf uns heruntergefahren (hat aber in der Entwicklung perfekt funktioniert ...). Was wir gelernt haben ist, dass Sie die Zeichenfolge zitieren müssen, da das & in einigen Kontexten als Sonderzeichen interpretiert wird, was der Zeile eine völlig andere Bedeutung gibt ...
Techmag

6

Anstatt gefälschte Daten wie 0000-00-00 00:00:00oder zu verwenden 0001-01-01 00:00:00(letzteres sollte akzeptiert werden, da es sich um ein gültiges Datum handelt), ändern Sie Ihr Datenbankschema, um NULLWerte zuzulassen .

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

Wenn Sie Ihre Datumsspalte nicht ändern oder die Werte aktualisieren können oder wenn diese Änderungen stattfinden, können Sie als Extem-Turnaround eine Auswahl anhand eines Falls / Wann vornehmen.

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;

1

Ich habe mit diesem Problem gerungen und die URL-Verkettungslösung von @Kushan in der oben akzeptierten Antwort implementiert. Es hat in meiner lokalen MySql-Instanz funktioniert. Aber wenn ich meine Play / Scala-App für Heroku bereitstellte, funktionierte sie nicht mehr. Heroku verkettet auch mehrere Argumente mit der DB-URL, die sie Benutzern zur Verfügung stellen, und diese Lösung, da Heroku die Verkettung von "?" vor ihren eigenen Argumenten wird nicht funktionieren. Ich habe jedoch eine andere Lösung gefunden, die genauso gut zu funktionieren scheint.

SET sql_mode = 'NO_ZERO_DATE';

Ich habe dies in meine Tabellenbeschreibungen aufgenommen und es hat das Problem gelöst, dass '0000-00-00 00:00:00' nicht als java.sql.Timestamp dargestellt werden kann


1

Sie können so versuchen

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);
}

0

Es gab kein Jahr 0000 und es gibt keinen Monat 00 oder Tag 00. Ich schlage vor, Sie versuchen es

0001-01-01 00:00:00

Während in einigen Standards ein Jahr 0 definiert wurde, ist es meiner Meinung nach eher verwirrend als nützlich.


2
Ja, es gibt ein Jahr 0000. Infact sein Jahr 0 und wir haben ein Jahr -1 und ein Jahr -1000. Ich habe diesen Gregorianischen Kalender oder diesen Anno Domini noch nie gesehen und insbesondere hat der Gregorianische Kalender kein Jahr Null, aber die ISO hat und die
ISO

@ Sirwilliam Vielen Dank für diese interessante Qualifikation. Es scheint, dass das OP wollte, dass das Jahr 0 als NULL oder etwas behandelt wird, das nicht existiert.
Peter Lawrey

1
In MySQL ist 0000-00-00 00:00:00 gleich 0. In Legacy-Code gibt es möglicherweise einige Abfragen, die davon abhängen.
Juha Palomäki

0

Wirf das Feld einfach als Zeichen

Beispiel: Besetzung (aktualisiert) als Zeichen als aktualisiert


0

Ich weiß, dass dies eine späte Antwort sein wird, aber hier ist die richtigste Antwort.

Ändern Sie in der MySQL-Datenbank Ihren timestampStandardwert in CURRENT_TIMESTAMP. Wenn Sie alte Datensätze mit dem falschen Wert haben, müssen Sie diese manuell korrigieren.


das wird auch nicht helfen.
Sunil Sharma

0

Sie können die Eigenschaft "not null" aus Ihrer Spalte in der MySQL-Tabelle entfernen, falls dies nicht erforderlich ist. Wenn Sie die Eigenschaft "not null" entfernen, ist keine Konvertierung von "0000-00-00 00:00:00" erforderlich, und das Problem ist behoben.

Zumindest für mich gearbeitet.


-2

Ich glaube, dies ist eine vollständige Hilfe für diejenigen, die dies unten erhalten. Ausnahme beim Pumpen von Daten durch logstash Fehler: logstash.inputs.jdbc - Ausnahme beim Ausführen der JDBC-Abfrage {: exception => #}

Antwort: jdbc: mysql: // localhost: 3306 / database_name? ZeroDateTimeBehavior = convertToNull "

oder wenn Sie mit MySQL arbeiten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.