私は、ALTERを実行する前に、私は、MySQLの日付と私が実行したいことを最後のステップにExcelの日付などから清めてきたさまざまな値を持っていた日付の列を持つ表は、列に任意の非日付値を削除することですしていますDATEにデータ型を変更することが、残念ながら、私は書かれていることをクエリが私にいくつかの問題を与えているコマンド。以下は、私の日付のサンプルです:
CREATE TABLE `date_checks`
(
`Start_Date` varchar(255) DEFAULT NULL
);
私のINSERT文:
INSERT INTO `date_checks` (`Start_Date`) VALUES
('04/04/2018'),
('01/05/2018'),
('3 years'),
('28/05/2018');
私の出力
Start_Date
04/04/2018
01/05/2018
3 years
28/05/2018
私が実行していることをクエリは以下の通りであります:
UPDATE 'date_checks' SET Start_Date = '' WHERE Start_Date NOT REGEXP '^[0-9]';
今、私は私の第三行の先頭に値3を持っているので、私は念の私は、この私はこのコラムで希望のすべてのように正しい方法を行うようにするいくつかの助けを取得したいので、これは、削除され得ることはありません推測しています日付の値です。私が書いたREGEXPは数字で始まっていないが、私は、私はそれをより具体的かつ正確であるために日付が列にある道にこれを拡張する必要が推測していますすべてのものを探しています。
上記のコードは、[OK]を実行している場合、私は、データ型を変更するには、次を実行します:
ALTER TABLE date_checks MODIFY Start_Date DATE;
誰かが私はこれについて正しい道を行くのだと助言することができれば、それをお願い申し上げます。
MySQLはDD / MM / YYYY形式で日付を理解していません。あなたが示してALTER TABLE文を実行する場合、それは彼らのDATE型の値にこれらの日付を変換するのに失敗します。
あなたはYYYY-MM-DD形式に文字列を変換する必要があります。
私は新しい列で始まることをお勧めしたいです。
ALTER TABLE date_checks ADD COLUMN Start_Date2 DATE;
そして、新しい列に値をコピーします。
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d/%m/%Y');
「3年」のような文字列がその関数でフォーマット文字列に一致するフォーマットでない場合は、STR_TO_DATE()はNULLを返します。
したがって、この更新した後には、適切な形式にコピーあなたの日付のほとんどを持っていますが、解析できませんでしたものはNULLになります。
次に、あなたが解析されることができなかった変わり者のケースを確認することができます。これらは、新しい列を手動でそれらを更新したいことを、いくつかの十分かもしれません。
SELECT Start_Date FROM date_checks WHERE Start_Date2 IS NULL;
あなたは手動で保存しておきたいいずれかを割り当てた後、残りのstart_dateの文字列が保持する価値はありません。その後、古い列を削除すること自由に感じ、および新しい列の名前を変更することができます。
ALTER TABLE date_checks DROP COLUMN Start_Date,
CHANGE COLUMN Start_Date2 Start_Date DATE;
あなたのコメント日時:
どのように私は両方を受け入れるように更新コードを変更するのでしょうか?
私はそれが1回のパスでこれを実行するために必要だということを知りません。あなたは、いくつかのパスでそれを行うことができます:
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d/%m/%Y');
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d-%m-%Y') WHERE Start_Date2 IS NULL;
UPDATE date_checks SET Start_Date2 = STR_TO_DATE(Start_Date, '%d.%m.%Y') WHERE Start_Date2 IS NULL;
...other formats...
したがって、各パスの後に、少ない行はまだStart_Date2のためのNULLを持っているでしょう。必要に応じて任意のより多くのNULLがないのいずれかまでは、他のフォーマットをしようとして続けるか、最後の数落伍者が解析可能ではないのであきらめたいです。
そこの1が残ったが、中に文字列があれば、あなたが何をすべきかのようなStart_Date
「私の舌と私の歯よりも少し年上として古いとして」、読み込み?
あなたは本当にそれが1つのパスで行われる必要がある場合は、いくつかの試行でCOALESCE()を使用することができます。
UPDATE date_checks SET Start_Date2 = COALESCE(
STR_TO_DATE(Start_Date, '%d/%m/%Y'),
STR_TO_DATE(Start_Date, '%d-%m-%Y'),
STR_TO_DATE(Start_Date, '%d.%m.%Y')
...other formats...
);
COALESCE()は、その最初の非NULLの引数を返します。それは左から右の順序でこれらのSTR_TO_DATE()の呼び出しのそれぞれを、しようとすると、結果は成功した最初のものになりますので。どれも成功しない場合や、他のNULL。