web-dev-qa-db-ja.com

1つのクエリですべてのvarchar日付形式を変更する

|date(varchar) |
|--------------|
|2016-02-16    |
| -------------|
|03-12-2015    |
|--------------|
|07-07-2007    |
|--------------|
|2016-03-14    |

日付はさまざまな形式で保存され、タイプはvarcharです。 MySQLで単一のクエリですべてのフォーマットを変更するにはどうすればよいですか?

形式はd/m/yd-m-yy/m/d

これらを日付形式の新しい列にコピーする必要がありますy-m-d

1

タイプ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_dateDEFAULT値がまだ残っている行があるかどうかを確認します。

2
Rick James

日付/時刻データ型に変換しようとしていることは理解しています。必要なのは、クエリの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
0
Marcin S.