wake-up-neo.com

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

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 0000-00-00 00:00:00 Zugewiesen, wenn die Tabellendaten mit der Datumsspalte aufgerufen werden, die einen Fehler ergibt

...'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, aber es wird der aktuellen Uhrzeit zugewiesen.

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

131

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

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

266
Kushan

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 von Nullen.
  • Diese "Funktion" ist in anderen Sprachen weit verbreitet.

Wenn ich also "nur die Datenbank ändere", werden Tausende von Zeilen mit PHP Code beschädigt.

Java-Programmierer müssen das MySQL-Zero-Date akzeptieren und , das ein Null-Datum in die Datenbank zurücksetzen muss, wenn andere Sprachen dieses "Feature" verwenden.

Ein Programmierer, der eine Verbindung zu MySQL herstellt, muss mit Null und 0000-00-00 sowie gültigen Daten umgehen. Das Ändern von 0000-00-00 in Null ist keine praktikable Option, da Sie dann nicht mehr bestimmen können, ob das Datum für das Zurückschreiben an die Datenbank erwartet wurde.

Für 0000-00-00 schlage ich vor, den Datumswert als Zeichenfolge zu überprüfen und dann in ("y", 1) oder ("yyyy-MM-dd", 0001-01-01) oder in eine ungültige zu ändern MySQL-Datum (weniger als Jahr 1000, Iirc). MySQL hat ein weiteres "Feature": Niedrige Daten werden automatisch in 0000-00-00 umgewandelt.

Ich erkenne, dass mein Vorschlag ein Kludge ist. Aber auch das Datumshandling von MySQL. Und zwei Kludges machen es nicht richtig. Tatsache ist, dass viele Programmierer mit MySQL-Zero-Dates für immer umgehen müssen.

12

Hängen Sie die folgende Anweisung an das JDBC-mysql-Protokoll an:

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

zum Beispiel:

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

Anstelle falscher Daten wie 0000-00-00 00:00:00 oder 0001-01-01 00:00:00 (letzteres sollte als gültiges Datum akzeptiert werden), ändern Sie Ihr Datenbankschema, um NULL-Werte zuzulassen.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL
6
npe

Wenn Sie Ihre Datumsspalte nicht ändern oder die Werte aktualisieren können, oder wenn diese Änderungen vorgenommen werden, können Sie im Extremfall eine Auswahl mit einem Fall/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;
3
VCeron

du kannst es 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);
}
1
13hola

Ich habe mit diesem Problem gerungen und die von @Kushan bereitgestellte URL-Verkettungslösung in der oben akzeptierten Antwort implementiert. Es hat in meiner lokalen MySql-Instanz funktioniert. Wenn ich meine Play/Scala-App bei Heroku implementierte, würde dies jedoch nicht mehr funktionieren. Heroku verkettet auch mehrere Argumente mit der von ihnen bereitgestellten DB-URL. Diese Lösung wird von Heroku verwendet, da "?" vor ihrem eigenen Satz von Argumenten funktioniert nicht. Ich habe jedoch eine andere Lösung gefunden, die gleichermaßen gut funktioniert.

SET sql_mode = 'NO_ZERO_DATE';

Ich habe dies in meine Tabellenbeschreibungen eingefügt und damit das Problem von .__ gelöst. '0000-00-00 00:00:00' kann nicht als Java.sql.Timestamp dargestellt werden

1
Aqume

schalte das Feld einfach als Zeichen aus

ZB: Besetzung (Aktualisierung) als Char als Aktualisierung

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 eher verwirrend als nützlich, IMHO.

0
Peter Lawrey

Sie können die Eigenschaft "nicht null" aus Ihrer Spalte in der mysql-Tabelle entfernen, wenn dies nicht erforderlich ist. Wenn Sie "Nicht-Null" -Eigenschaft entfernen, müssen Sie nicht "0000-00-00 00:00:00" konvertieren und das Problem ist nicht mehr vorhanden.

Zumindest für mich gearbeitet.

0
Celik

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

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

0
PeakGen