Il s'agit d'une erreur de définition de la table. Il y a es année 0, mais il n'y a pas de 0e mois et de 0e jour, le premier jour de chaque année est le 1er janvier. Donc la "date zéro" correcte est :
0000-01-01 00:00:00
(J'ai essayé cela, et ça marche).
\=== UPDATE ===
1. Temps zéro vs. JDBC
Lorsque j'ai écrit cette réponse il y a plus d'un an, je n'avais pas MySQL sous la main, j'ai donc testé uniquement la conversion des chaînes de caractères en horodatage. J'ai considéré ce test comme valide, puisque le PO s'est plaint d'une exception levée par son programme Java :
'0000-00-00 00:00:00' can not be represented as java.sql.Timestamp
J'ai donc écrit une simple application Java en console pour tester mon "temps zéro". J'ai essayé de le recréer aquí . Le code de test :
import java.sql.*;
class Main {
public static void main (String[] args) {
try {
String[] s = {
"1970-01-01 00:00:00", // UNIX epoch
"0000-01-01 00:00:00", // My "zero time"
"0000-00-00 00:00:00" // The OP's zero time
};
for (int i = 0; i < s.length; ++i) {
Timestamp t = Timestamp.valueOf(s[i]);
System.out.println(t.toString() + ", " + t.getTime());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Le résultat :
1970-01-01 00:00:00.0, 0
0001-01-01 00:00:00.0, -62167392000000
Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
Il est intéressant de noter que, bien que ma chaîne de temps zéro puisse être convertie en java.sql.Timestamp
sa version en chaîne est erronée. L'exception levée pour l'heure zéro du PO est également étrange, car il n'y a aucun problème avec son format.
2. Temps zéro contre MySQL
J'ai créé aujourd'hui un simple bidule MySQL pour tester les timestamps par défaut, voir aquí . Définition du tableau :
CREATE TABLE test
(
id INT AUTO_INCREMENT PRIMARY KEY,
t TIMESTAMP NOT NULL DEFAULT '1970-01-01 00:00:01',
x DOUBLE NOT NULL
);
Données d'essai :
INSERT INTO test (x) VALUES (3.14);
INSERT INTO test (t, x) VALUES ('2013-08-27 11:36:33', 42);
Contenu de la table :
ID T X
1 January, 01 1970 00:00:01+0000 3.14
2 August, 27 2013 11:36:33+0000 42
J'ai expérimenté avec différents timestamps par défaut, et j'ai trouvé que le défaut ci-dessus est la valeur minimale acceptée par MySQL. Par exemple, tous ces timestamps sont invalides : '1970-01-01 00:00:00'
, '0000-01-01 00:00:00'
, '0000-00-00 00:00:00'
. Le message d'erreur est le suivant Invalid default value
o Cannot convert value to TIMESTAMP
en fonction de sql_mode
. L'explication se trouve dans le doc :
Le type de données TIMESTAMP est utilisé pour les valeurs qui contiennent à la fois une date et une heure. et de l'heure. TIMESTAMP est compris entre '1970-01-01 00:00:01' UTC et 2038-01-19 03:14:07' UTC.
En conclusion Il s'est avéré que la conversion des chaînes en horodatage de MySQL est plus stricte que celle de l'API JDBC. En d'autres termes, le temps zéro que j'ai suggéré dans ma réponse initiale ne fonctionne pas avec MySQL.