web-dev-qa-db-ja.com

MySQLのLOADDATA LOCAL INFILEを使用して、CSVのインポート時に文字列の日付をMySQLの日付形式に変更する方法

MySQLのLOADDATA LOCAL INFILE SQLステートメントを使用して、CSVファイルから既存のデータベーステーブルにデータをロードしています。

SQLステートメントの例を次に示します。

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

DateOfBirthフィールドにマップするCSVの3番目の列には、現在、次の形式の日付があります。

_14-Feb-10
_

上記のSQLステートメントを変更して、日付をMySQLの日付形式(_2010-02-14_)にフォーマットするにはどうすればよいですか?

以下を使用して通常のINSERT構文を使用するときに文字列の日付を変換する方法を知っています。

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

17
Camsoft

SET句を変数とともに使用して、その列の行の内容を参照する必要があります。列リストで、日付列を変数名に割り当てます。その後、SETステートメントで使用できます。 (注:これをテストするためのMySQLが目の前にありません。)

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')

次のページの例を参照してください: http://mysql2.mirrors-r-us.net/doc/refman/5.1/en/load-data.html (このページが表示される理由がわからない実際にはSETの使用例が含まれているという点で、メインのドキュメントとは異なります。)

26
Alison R.

テストの柔軟性を少し高める、もう少し長いプロセス:

  • たとえば、呼び出されるVARCHAR(64)列を使用します。 mydate_textは、インポートするフォーマットされていない日付を保持します。
  • このプレーンテキストフィールドに日付を入力してテーブルをロード/インポートします
  • 次のようなクエリを実行します

    UPDATE mytable SET mydate = STR_TO_DATE(mydate_text、 '%Y-%b-%d')

  • すべて問題ないように見える場合は、mydate_text列を削除してください

  • 問題がない場合は、新しい形式で再試行してください。

この手法の利点は、特に長さのテーブル列で、やや面倒なMySQL LOAD DATA構文を使用してテーブルを再インポートすることなく、フォーマットを試すことができることです。自分が何をしているのかを正確に知っている場合は、上記の答えが最適です。 MySQLの専門家でない場合は、フォーマットを正確に取得するまで、この手法が役立ちます。

5
Pete855217