'0000-00-00 00:00:00' non può essere rappresentato come errore java.sql.Timestamp


141

Ho una tabella di database contenente date

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

Sto usando MySQL. Dal programma a volte i dati vengono passati senza la data al database. Pertanto, il valore della data viene assegnato automaticamente 0000-00-00 00:00:00 quando vengono chiamati i dati della tabella con la colonna della data che dà errore

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

Ho provato a passare il valore null alla data durante l'inserimento dei dati, ma viene assegnato all'ora corrente.

Esiste un modo per ottenere ResultSetsenza modificare la struttura della tabella?

Risposte:


302

È possibile utilizzare questo URL JDBC direttamente nella configurazione dell'origine dati:

jdbc: mysql: // nomeserver: 3306 / yourdatabase zeroDateTimeBehavior = convertToNull


2
curioso. Leggendo le altre risposte, non c'è mese zero. Cosa significa veramente?
Giovedì

2
Sai se esiste un equivalente di MariaDB da aggiungere al mio URL jdbc? jdbc: mariadb: // localhost: 3306 / dev? zeroDateTimeBehavior = convertToNull non sembra funzionare per me.
jeffkempf,

Dovevo essere CONVERT_TO_NULL per me
routeburn

16

Se la "data" 'registrazione "sia o meno una" data "valida è irrilevante per la domanda." Basta cambiare il database "raramente è una soluzione praticabile.

I fatti:

  • MySQL consente una data con il valore di zeri.
  • Questa "caratteristica" gode di un uso diffuso con altre lingue.

Quindi, se "cambio solo il database", si romperanno migliaia di righe di codice PHP.

I programmatori Java devono accettare MySQL zero-date e devono reinserire una data zero nel database, quando altre lingue fanno affidamento su questa "funzionalità".

Un programmatore che si collega a MySQL deve gestire null, registrazione e date valide. Cambiare la registrazione in null non è un'opzione praticabile, perché in questo modo non è più possibile determinare se la data prevista per la registrazione dovrebbe essere ripristinata nel database.

Per la registrazione, suggerisco di controllare il valore della data come stringa, quindi di cambiarlo in ("y", 1) o ("yyyy-MM-dd", 0001-01-01) o in qualsiasi altro Data MySQL (meno dell'anno 1000, iirc). MySQL ha un'altra "caratteristica": le date basse vengono automaticamente convertite in registrazione.

Mi rendo conto che il mio suggerimento è un kludge. Ma lo è anche la gestione delle date di MySQL. E due kludges non lo fanno bene. Il fatto è che molti programmatori dovranno gestire per sempre le date zero di MySQL .


9

Aggiungi la seguente dichiarazione al protocollo JDBC-mysql:

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

per esempio:

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

5
Stai attento con questo approccio. Funziona come un incantesimo ma ha rimosso un server di produzione su di noi (ha funzionato perfettamente in sviluppo però ...). Quello che abbiamo imparato è che dovrai citare la stringa come & viene interpretato come un carattere speciale in alcuni contesti, dando alla linea un significato completamente diverso ...
Techmag,

6

Invece di utilizzare date false come 0000-00-00 00:00:00o 0001-01-01 00:00:00(quest'ultima dovrebbe essere accettata in quanto è una data valida), modifica lo schema del database per consentire i NULLvalori.

ALTER TABLE table_name MODIFY COLUMN date TIMESTAMP NULL

3

In alternativa, quando non è possibile apportare modifiche alla colonna della data o per aggiornare i valori o mentre si verificano queste modifiche, è possibile effettuare una selezione utilizzando un caso / quando.

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

Ho affrontato questo problema e ho implementato la soluzione di concatenazione degli URL fornita da @Kushan nella risposta accettata sopra. Ha funzionato nella mia istanza MySql locale. Ma quando ho distribuito la mia app Play / Scala su Heroku non funzionava più. Heroku concatena anche diversi argomenti all'URL del DB che forniscono agli utenti, e questa soluzione, a causa dell'uso da parte di Heroku di "?" prima che il proprio set di arg, non funzionerà. Tuttavia ho trovato una soluzione diversa che sembra funzionare altrettanto bene.

SET sql_mode = 'NO_ZERO_DATE';

L'ho inserito nelle descrizioni delle mie tabelle e ho risolto il problema di "registrazione 00:00:00" che non può essere rappresentato come java.sql.


1

puoi provare così

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

Non c'è stato l'anno 0000 e non c'è il mese 00 o il giorno 00. Suggerisco di provare

0001-01-01 00:00:00

Mentre un anno 0 è stato definito in alcuni standard, è più probabile che sia confuso che utile IMHO.


2
Sì, c'è un anno 0000. infatti è l'anno 0 e abbiamo un anno -1 e un anno -1000. Non ho mai visto questo calendario gregoriano o questo Anno Domini e, più precisamente, il calendario gregoriano non ha un anno zero ma l'iso ha e l'iso è usato con i computer vedi 0 anni
botenvouwer

@sirwilliam Grazie per l'interessante qualifica. Sembra che l'OP abbia voluto che l'anno 0 venisse trattato come NULL o qualcosa che non esiste.
Peter Lawrey,

1
Nella registrazione di MySQL 00:00:00 è uguale a 0. Nel codice legacy potrebbero esserci delle domande che si basano su questo.
Juha Palomäki,

0

basta lanciare il campo come carattere

Ad esempio: cast (aggiornato) come carattere come aggiornato


0

So che questa sarà una risposta tardiva, tuttavia ecco la risposta più corretta.

Nel database MySQL, modifica il timestampvalore predefinito in CURRENT_TIMESTAMP. Se hai vecchi record con il valore falso, dovrai ripararli manualmente.


anche questo non aiuta.
Sunil Sharma,

0

È possibile rimuovere la proprietà "non null" dalla colonna nella tabella mysql se non necessario. quando si rimuove la proprietà "non nulla" non è necessaria la conversione "registrazione 00:00:00" e il problema scompare.

Almeno ha funzionato per me.


-2

Credo che questo sia un aiuto completo per chi sta ottenendo questo sotto Eccezione sul pompaggio dei dati tramite logstash Errore: logstash.inputs.jdbc - Eccezione durante l'esecuzione della query JDBC {: exception => #}

Risposta: jdbc: mysql: // localhost: 3306 / database_name zeroDateTimeBehavior = convertToNull"

o se stai lavorando con mysql

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.