|date(varchar) |
|--------------|
|2016-02-16 |
| -------------|
|03-12-2015 |
|--------------|
|07-07-2007 |
|--------------|
|2016-03-14 |
日付はさまざまな形式で保存され、タイプはvarchar
です。 MySQLで単一のクエリですべてのフォーマットを変更するにはどうすればよいですか?
形式はd/m/y
、d-m-y
、y/m/d
。
これらを日付形式の新しい列にコピーする必要がありますy-m-d
タイプDATE
として新しい列を作成します。
次に、必要な変換ごとに1つずつ、3つのクエリを実行します。もちろん、それらを1つのクエリに結合することはできますが、なぜ煩わしいのでしょうか。それはそれをより複雑にし、壊れやすくします。
そして最後に、古い列をドロップし、新しい名前を所定の場所に変更しますか?
クエリは次のようになります。
ALTER TABLE add COLUMN new_date DATE;
UPDATE tbl SET new_date = STR_TO_DATE(date,'%d-%m-%Y') WHERE substring(date,3,1) = '-';
UPDATE tbl SET new_date = STR_TO_DATE(date,'%d/%m/%Y') WHERE substring(date,3,1) = '/';
UPDATE tbl SET new_date = STR_TO_DATE(date,'%Y/%m/%d') WHERE substring(date,5,1) = '-';
次にSELECT
を実行して、new_date
のDEFAULT
値がまだ残っている行があるかどうかを確認します。
日付/時刻データ型に変換しようとしていることは理解しています。必要なのは、クエリのCASE式だけです。
これは機能するはずです。これらの3つのバリアントが発生する唯一のものであり、追加の先頭または末尾の空白文字がないと仮定します。
このケース式を改良して他のバリアントを含めることは、次のように簡単です。
CASE date
WHEN substring(date,3,1) = '-' THEN STR_TO_DATE (date,'%d-%m-%Y')
WHEN substring(date,3,1) = '/' THEN STR_TO_DATE (date,'%d/%m/%Y')
ELSE STR_TO_DATE (date,'%Y/%m/%d') END