2010-06-19 15 views
1

Il existe d'autres questions où les utilisateurs ont des problèmes avec l'horodatage étant tous des zéros. Je les ai vérifiés et ce n'est pas un doublon.Problème lors de l'insertion de la valeur d'horodatage dans MySQL

Je déclare une table comme ceci:

CREATE TABLE `my_db`.`my_table` (
    `time_stamp` timestamp NOT NULL, 
    `author` varchar() NOT NULL, 
    `text` text NOT NULL, 
    `md5` int(11) NOT NULL, 
    PRIMARY KEY (`time_stamp`) 
) ; 

J'ai aussi une deuxième table qui aura un horodatage comme clé primaire et ils devraient avoir la même valeur.

Codage en Delphi, j'utilise SELECT CURRENT_TIMESTAMP qui renvoie quelque chose comme '19/6/2010 4:56:17 AM' que j'utilise ensuite dans une instruction INSERT. L'INSERT réussit, mais l'horodatage est tous des zéros.

Qu'est-ce que je fais mal?

Voici le code INSERT:

sqlCommand := 'INSERT INTO my_db.my_table(time_stamp, author, text, md5) VALUES ("' 
        + timestamp + 
        '", "mawg", ' + 
        '"Hello, world"' + 
        0 + 
        '");'; 
    Result := DoSQlCommandWithNoResultSet(sqlCommand, AdoConnection); 

insertion sera très faible taux, une entrée toutes les quelques semaines ou quelques mois peut-être, alors je suis heureux avec horodatage comme clé primaire. Je garde des «versions» des choses, donc l'horodatage a du sens pour moi. Je prie de penser que c'est un problème d'ADO, bien que je m'attendrais à ce que ADO "passe juste". Je ne vois pas d'autre solution. Dans une console, la sortie est "correcte", mais lorsqu'elle est exécutée via ADO dans Delphi alors elle est erronée

Puis-je spécifier à MySQL comment il doit formater ses dates?

+2

Voyons le code qui effectue l'insertion. – wallyk

+2

Êtes-vous absolument certain de vouloir utiliser le champ d'horodatage? Pensez à utiliser le type de données à la place. Et il est impossible d'avoir '19/6/2010 4:56:17 AM 'de CURRENT_TIMESTAMP –

+0

@ wallyk +1 - fait – Mawg

Répondre

2

Après avoir examiné la documentation MySQL, il semble que si votre valeur timestamp est formaté de manière incorrecte, il cause normalement l'horodatage d'être '0000-00-00 00:00:00'. Dans tous les cas, vous n'avez pas besoin de spécifier une valeur d'horodatage — qui est l'avantage de TIMESTAMP sur DATETIME. Et même si vous l'avez fait, vous pouvez simplement le définir sur NOW() au lieu d'exécuter une instruction inutile SELECT.

Edit:

De plus, je sais que vous avez dit que vous pensiez que cela à travers, mais vous avez envisagé l'heure d'été? Cela peut entraîner la même horodatage pour deux enregistrements lorsque l'horloge est remise à l'automne.

Edit 2:

K, je ne sais pas pourquoi je ne l'ai pas attrapé plus tôt, mais ce format d'horodatage fourni est incorrect. Essayez d'insérer un horodatage valide comme '2010/06/19 4:56:17'. MySQL a analysé les valeurs de temps, mais il doit toujours être year-month-date et hour-minute-seconds.

Edit 3:

D'accord, il semble y avoir un peu de confusion sur cela, alors je vais après cette citation de MySQL 5.0 page doc sur le DATETIME format:

pour les valeurs spécifiées comme les chaînes qui incluent des délimiteurs de partie de date, il n'est pas nécessaire de spécifier deux chiffres pour les valeurs de mois ou de jour qui sont inférieures à 10. '1979-6-9' est identique à '1979-06-09'. De même, pour les valeurs spécifiées comme des chaînes qui incluent des délimiteurs de partie temporelle, il n'est pas nécessaire de spécifier deux chiffres pour les valeurs d'heure, de minute ou de seconde inférieures à 10. '1979-10-30 1: 2: 3' est la même comme '1979-10-30 01:02:03'.

+1

Il devrait être 'HH', pas' H', donc ' 2010/06/19 04: 56: 17 »est correct. – hudolejev

+1

Eh bien, vous êtes autorisé à omettre le zéro précédent dans les mois à un chiffre/dates/heures/minutes/secondes. Vérifiez à nouveau les documents (après la partie sur les dates illégales étant converties en 0000-00 ...). Je pense que c'est principalement l'ordre des valeurs de date qui le détraque. –

+0

+! "Après avoir examiné la documentation MySQL, il semble que si votre valeur d'horodatage est incorrectement formatée" +1 "Cela devrait être HH, pas H" - c'est ce que je pensais ... _ * MAIS * _ J'ai la valeur de 'SELECT CURRENT_TIMESTAMP' - peut-il s'agir d'un problème Delphi? Je ne vois pas comment - il récupère juste une corde. – Mawg

2

Jetez un oeil à MySQL date functions. Ils sont très étendus et permettent une grande flexibilité. En plus de tout cela, je recommande de repenser la structure de votre table. Un timestap en tant que clé primaire n'est pas exactement ce que vous voulez. Lorsque vous avez un trafic élevé, il peut arriver que l'horodatage soit le même. De plus, si vous sauvegardez 2 enregistrements ou plus à la suite, l'horodatage sera le même. En outre, votre colonne MD5 est définie sur int (11). Les hachages MD5 utilisent des caractères mixtes, donc je préfère aller avec varchar (32).

CREATE TABLE `my_db`.`my_table` ( 
    `id` int(11) NOT NULL, 
    `timestamp` timestamp NOT NULL, 
    `author` varchar(100) NOT NULL, 
    `text` text NOT NULL, 
    `md5` varchar(32) NOT NULL, 
PRIMARY KEY (`id`) 
) ; 
+0

oui, je les ai regardé. Mais j'ai un problème, c'est pourquoi je suis ici: -/ Et oui, je l'ai pourtant bien et un horodatage est exactement ce que je veux. J'ai besoin de capturer une "version" et il n'y a pas d'autre moyen de le faire. Et, oui, timestamp peut se produire en même temps, mais ma demande est filetée, avec mutex, etc Au moins, je pense que je sais ce que je fais ;-) BTW, +1 Merci pour la réponse – Mawg

+0

+1, l'horodatage en tant que clé primaire est une mauvaise idée. – hudolejev

+0

@hudolejev - J'ai vraiment besoin de "versions". L'horodatage est la seule clé possible (*) pour une table d'index de première étape qui pointe vers d'autres tables plus "normalement indexées". (* Je pourrais utiliser quelque chose de très artificiel comme PK Mawg

1

AFAIR 19/6/2010 4:56:17 AM est pas un format de date valide pour les types de date MySQL. Vous devez le convertir en 2010-06-19 04:56:14 (voir doc).

+0

+1 La chose étrange est que j'ai obtenu cette chaîne de MySQL lui-même avec 'SELECT CURRENT_TIMESTAMP'. Y at-il une fonction pour "normaliser" l'horodatage? – Mawg

+1

Peut-être que 'STR_TO_DATE() '? http://dev.mysql.com/doc/refman/5.0/fr/date-and-time-functions.html#function_str-to-date – hudolejev

+0

+1 mais pourquoi devrait-il utiliser 'STR_TO_DATE()'? J'utilise juste la valeur de réajustement de 'NOW()' – Mawg