2017-02-06 9 views
-1

私は、92の医学出版物(name、date_published、citation、source、abstract)を記述したテーブルを扱っています。mysql - 日付の一部が欠けているときに文字列を日付カラムに変換する

元のスプレッドシートでは、date_publishedの値をYYYY-MM-DDとして書きました。しかし、いくつかの出版物は、その日が欠けていた - 彼らはちょうどMMとYYYYを持っていた。その列の文字数を各行に一貫して維持するために、不足している曜日を00(2014-09-00)と置き換えました。

MysqlはDATEデータ型の00で正常ではなく、正しくcsvをインポートすることを拒否しました。だから、私はその列のデータ型をVARCHARに変更して、すべてを完全にインポートしました。

date_published列のすべてをVARCHARからDATEに変換する必要があります。 00日をnullとして扱いますが、それでも月と年を正しく解釈するにはどうすればよいですか?

編集:出版物の一部は、リリースされた日を明記しているものもありますが、ほとんどの文献はそうではありません。もしそうなら、私はそれを記録する必要があります。彼らがいない場合、私は1日を補うことができません(01を00に置き換えて有効なYYYY-MM-DDエントリにするなど)。これは学術的なウェブサイトのためのものであり、彼らは研究の公開日について非常に特殊です。

+1

https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format –

+0

ここに事があります。日付データ型はVALID日付のみを格納します。あなたが見た通り、00は有効な日ではありません。したがって、月/年コンボの有効日を選択して、あなたは良いです。 「日」を表示しない場合は、日付フィールドの精度を指定する列を追加します。次に、あなたが日付を表示するために行くとき、そのプレビジョンが "月"と言うなら、その日を除外するように出力をフォーマットします。 'date_format(DateField、%M%Y)'のように。2017年2月を取得し、日付文字は「非表示」です。 3つのフィールドを使用し、日付を00に、フォーマットを出力date_format(to_date( '2017-02-01')、%M%Y)に組み合わせます。 – xQbert

+0

代わりに3つの日付フィールドを使用して、これらのフィールドを表示します。 2016年9月にリストアップされた日と2016年9月28日にリストされた日付のものについては、2017年は月、日がリストされていない場合があります。しかし、あなたは日付バリデーションを失います。 IMOこれは、データベースに照会して日付形式をバイパスできる他の人がデータベースに直接アクセスできる場合にこれを行う唯一の方法です。彼らはPHPを介してのみ照会することができる場合、あなたは完全なコントロールを持っており、日付に01を追加し、それがうまくいくフォーマットします。 – xQbert

答えて

0

MySQLはこのように日付を正しく解釈せず、00を01に置き換えます。 例; 2014年9月1日

+0

残念ながら、00を他の許容可能な日付整数に置き換えることはできません。これは、これらの出版物に関しては詐欺になるからです。この研究が発表されたときを正確に示すことは非常に重要です。 00をnullとして登録する方法はありますか? – League14

+1

@ League14一ヶ月の0日に研究が行われたと述べるには、もっと正確なことはありえますか?日付が「おおよそ」の場合や正しいデータ型の使用を停止する必要があることを示す追加の列を追加する必要があるように思えます。 –

+0

@AaronBertrandそれはどんな意味でも正確ではありません。だからこそ、私は1日が欠落しているエントリに対して、その日を00または01の代わりにnullにすることを試みています。 – League14

1

あなたはこのようなインポートと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> 
+0

を除き、OPは日付をまったく持ちたくないことを示しています。レース14のKenの答えに対する最初のコメントごとに、日付を01にするのは不適切です。余分な列を追加するというAaronの反応は右のトラックに沿っている。 – xQbert

+0

@xQbert - はい私は余分な列を持つサンプルを追加しました。それはまた、輸入によって満たされたものになります。 –

関連する問題