2010-02-10 27 views
15

Estoy usando LOAD DATA LOCAL INFILE SQL declaración de MySQL para cargar datos de un archivo CSV en una tabla de base de datos existente.Cómo cambiar la fecha de cadena al formato de fecha de MySQL en el momento de importar CSV utilizando MySQL LOAD DATA LOCAL INFILE

Aquí es una sentencia SQL de ejemplo:

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
(name, address, dateOfBirth) 

La tercera columna de la CSV que se asigna al campo fechaDeNacimiento actualmente cuenta la fecha en el siguiente formato:

14-Feb-10 

¿Cómo puedo modificar la declaración SQL anterior para formatear la fecha en el formato de fecha de MySQL, es decir, 2010-02-14?

sé cómo convertir una fecha de cadena cuando se utiliza la sintaxis INSERT normal usando:

STR_TO_DATE('14-Feb-10', '%d-%b-%y')

Respuesta

23

Es necesario utilizar la cláusula SET, junto con una variable para hacer referencia a los contenidos de la fila en la que la columna . En su lista de columnas, asigna su columna de fecha a un nombre de variable. Luego puede usarlo en su declaración SET. (Tenga en cuenta, no tengo MySQL frente a mí para probar esto.)

LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
(name, address, @var1) 
set dateOfBirth = STR_TO_DATE(@var1, '%d-%b-%y') 

ver ejemplos de una manera abajo de la página en: http://mysql2.mirrors-r-us.net/doc/refman/5.1/en/load-data.html (No sé por qué esta página parece diferir de la documentación principal de que en realidad contiene un ejemplo de SET uso)

+0

Pedante tal vez, pero creo que debería ser% m en lugar de% M ... – Everyone

+2

@Todo el mundo Gracias. En realidad, parece que debe ser '% b', para el nombre abreviado del mes, de acuerdo con el ejemplo dado en la pregunta. –

+0

Tienes razón. Mi error. – Everyone

4

un proceso ligeramente más largo que le da un poco de flexibilidad pruebas:.

  • Utilice un VARCHAR (64) columna callsed por ejemplo. mydate_text para mantener la fecha no formateada que importa.
  • carga hasta/importar la mesa poner la fecha en este campo de texto plano
  • Ejecutar una consulta como

    ACTUALIZACIÓN SET mitabla mydate = STR_TO_DATE (mydate_text, '% Y-% b-% d')

  • Si todo se ve bien, deje caer su columna mydate_text

  • Si no está bien, simplemente vuelve a intentarlo con un nuevo formato.

La ventaja de esta técnica es que le permite jugar con los formatos sin tener que volver a importar la tabla utilizando la sintaxis LOAD DATA de MySQL, especialmente con columnas de tabla de longitud. Si sabe exactamente lo que está haciendo, la respuesta anterior es la mejor. Si no eres un experto en MySQL, esta técnica puede ser útil hasta que obtengas los formatos correctos.

Cuestiones relacionadas