2010-11-23 24 views
4

Je travaille sur une table qui a deux formats de dates stockés dans un champ certains sont en mm/jj/aa et les nouvelles entrées sont en aaaa/mm/jj comme ils devraient l'être.mise à jour d'un format de date dans mysql

Je veux exécuter une requête comme celui-ci

UPDATE table 
    SET date_field = DATE_FORMAT(date_field, '%Y/%m/%d') 
WHERE date_field = DATE_FORMAT(date_field, '%m/%d/%y') 

Mais il est tout simplement pas ELABORATION. Un résultat que j'ai obtenu était qu'il prenait juste les données de% m et les transformait en% Y et gâchait vraiment les données.

Des pensées?

+1

Quel est le type de colonne de date_field? si c'est la date, ou l'horodatage - vous ne pouvez pas réorganiser Ymd à mdy – Mikhail

Répondre

13

Vous souhaitez utiliser la fonction STR_TO_DATE, et non DATE_FORMAT. De plus, je suppose que vous voulez seulement mettre à jour les dates mal renseignées, donc je suppose que vous pourriez faire ceci:

UPDATE your_table 
SET date_field = DATE(STR_TO_DATE(date_field, '%m/%d/%Y')) 
WHERE DATE(STR_TO_DATE(date_field, '%m/%d/%Y')) <> '0000-00-00'; 

P.S. Les tables contiennent colonnes, pas les champs. Et vous ne devriez pas utiliser un type de chaîne pour contenir vos dates, mais le type DATE

+0

Merci, cela devrait très bien se redresser. Ensuite, nous pouvons aller de l'avant pour obtenir le reste du site. Il est passé de ASP à PHP et MS SQL à MySQL! C'est incroyable qu'il soit encore debout! Ha! –

4

Vous souhaitez utiliser STR_TO_DATE pour convertir d'abord la chaîne incorrecte en un objet date réel, puis utiliser DATE_FORMAT pour le rétablir dans une chaîne au format souhaité.

En outre, votre condition WHERE ne fonctionnera pas comme ça. Vous devriez chercher des chaînes du mauvais format en utilisant LIKE.

UPDATE your_table SET date_field = 
    DATE_FORMAT(STR_TO_DATE(date_field, '%m/%d/%y'), '%Y/%m/%d') 
WHERE date_field LIKE '__/__/____' 
+0

Merci, cela a fonctionné –

1

Pensées? Ah oui, trois en fait:

  • ne pas réinventer la roue. Oui, oui, je sais qu'il est tentant de faire à partir de zéro ce que seulement un million de personnes ont inventé avant (pas de sarcasme prévu), mais MySQL a un bon format, efficace et utilisable, utilisez cela; seulement faire le formatage sur l'entrée/sortie. Cela vous permet d'éviter ce genre de mélange de données (la date elle-même) et de présentation (format de date).

  • En ce qui concerne les données, restaurer la en bon état de sauvegarde (vous avez des sauvegardes, non?) - dans le cas général, il n'y a aucun moyen infaillible de dire non converti y/m/j à partir déjà converti m/j/a et les dates sont indiquées pour toutes fins pratiques. (surtout pas en 2010 - par exemple 08/10/09 peut signifier plusieurs dates valides).

  • En outre, quel genre d'idée est-il de ne stocker que 2 chiffres de la date? C'est exactement le genre de pince-sans-rire à courte vue qui a provoqué le passage du temps et de l'argent à l'an 2000. (évité si vous stockez la date, vous le savez, dans un format de date).