あなたはこのようなインポートと0の直接置き換えることができます。
LOAD DATA INFILE 'my.csv'
INTO TABLE TABLE_NAME
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, column2, column3, @mydate) -- read one of the field to variable
SET mydate = STR_TO_DATE(CONCAT(SUBSTRING_INDEX(@mydate, '-', 2),'-',
GREATEST(SUBSTRING_INDEX(@mydate, '-', -1),1)), '%Y-%m-%e');
サンプル
CSV
$ cat my.csv
1,foo,'bar,2017-01-00
2,foo2,'bar2,2016-04-12
3,foo,'bar,2015-08-00
インポートを
mysql> LOAD DATA INFILE 'my.csv'
-> INTO TABLE TABLE_NAME
-> FIELDS TERMINATED BY ','
-> LINES TERMINATED BY '\n'
-> (id, column2, column3, @mydate) -- read one of the field to variable
-> SET mydate = STR_TO_DATE(CONCAT(SUBSTRING_INDEX(@mydate, '-', 2),'-',
-> GREATEST(SUBSTRING_INDEX(@mydate, '-', -1),1)), '%Y-%m-%e');
Query OK, 3 rows affected (0,00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT * FROM table_name;
+----+---------+---------+---------------------+
| id | column2 | column3 | mydate |
+----+---------+---------+---------------------+
| 1 | foo | 'bar | 2017-01-01 00:00:00 |
| 2 | foo2 | 'bar2 | 2016-04-12 00:00:00 |
| 3 | foo | 'bar | 2015-08-01 00:00:00 |
+----+---------+---------+---------------------+
3 rows in set (0,00 sec)
mysql>
余分なカラムと試料2
mysql> SELECT * FROM table_name;
Empty set (0,00 sec)
mysql> LOAD DATA INFILE 'my.csv'
-> INTO TABLE TABLE_NAME
-> FIELDS TERMINATED BY ','
-> LINES TERMINATED BY '\n'
-> (id, column2, column3, @mydate) -- read one of the field to variable
-> SET haveDay = IF(SUBSTRING_INDEX(@mydate, '-', -1) = 0 , 0 ,1),
->
-> mydate = STR_TO_DATE(CONCAT(SUBSTRING_INDEX(@mydate, '-', 2),'-',
-> GREATEST(SUBSTRING_INDEX(@mydate, '-', -1),1)), '%Y-%m-%e');
Query OK, 3 rows affected (0,01 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT * FROM table_name;
+----+---------+---------+---------------------+---------+
| id | column2 | column3 | mydate | haveDay |
+----+---------+---------+---------------------+---------+
| 1 | foo | 'bar | 2017-01-01 00:00:00 | 0 |
| 2 | foo2 | 'bar2 | 2016-04-12 00:00:00 | 1 |
| 3 | foo | 'bar | 2015-08-01 00:00:00 | 0 |
+----+---------+---------+---------------------+---------+
3 rows in set (0,00 sec)
mysql>
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format –
ここに事があります。日付データ型はVALID日付のみを格納します。あなたが見た通り、00は有効な日ではありません。したがって、月/年コンボの有効日を選択して、あなたは良いです。 「日」を表示しない場合は、日付フィールドの精度を指定する列を追加します。次に、あなたが日付を表示するために行くとき、そのプレビジョンが "月"と言うなら、その日を除外するように出力をフォーマットします。 'date_format(DateField、%M%Y)'のように。2017年2月を取得し、日付文字は「非表示」です。 3つのフィールドを使用し、日付を00に、フォーマットを出力date_format(to_date( '2017-02-01')、%M%Y)に組み合わせます。 – xQbert
代わりに3つの日付フィールドを使用して、これらのフィールドを表示します。 2016年9月にリストアップされた日と2016年9月28日にリストされた日付のものについては、2017年は月、日がリストされていない場合があります。しかし、あなたは日付バリデーションを失います。 IMOこれは、データベースに照会して日付形式をバイパスできる他の人がデータベースに直接アクセスできる場合にこれを行う唯一の方法です。彼らはPHPを介してのみ照会することができる場合、あなたは完全なコントロールを持っており、日付に01を追加し、それがうまくいくフォーマットします。 – xQbert