本当にDATEであるべきVARCHAR列を持つデータベースを継承しました。フォームのチェックはありません(修正する必要があります)。そのため、日付は常に2016-12-04などではなく2016-12-4として入力されます。
歴史的に悪い日付がたくさんあると確信しているので、データ型をDATEに変更することについては少し慎重ですが、それを変更するための適切な戦略は何ですか?
背景:(私はDBAではなくフロントエンド開発者なので、SQLを回避することはできますが、何がわからないのかわからず、間違いを犯して間違いを犯します。データベース)。
str_to_date()
を使用して変換を処理します。
str_to_date('2016-12-4', '%Y-%m-%d');
SELECT CAST('2016-12-4' AS DATE);
-> 2016-12-04
なので、必要ありませんstr_to_date
。
日付の新しい列を追加します(ALTER TABLE .. ADD COLUMN ..
); UPDATE
新しい列を設定します。次に、実際にめちゃくちゃになった値を手動で修正します。最終的に DROP COLUMN
およびRENAME COLUMN
;
ORDER BY
a VARCHAR
に日付が含まれていると、間違った答えが返される場合があります。 (1月と11月は混乱する場合があります。)特定の日付のテストが失敗する場合があります。 (先頭の0がありません。)
また、DATE列にインデックスを付けると、特定のクエリが高速になります。
VARCHAR列をDATE列に変更することも問題になりません。
テストテーブルとデータ
CREATE TABLE test.t1( `date_start` VARCHAR(20) );
INSERT INTO test.test1 VALUES('2016-1-5');
INSERT INTO test.test1 VALUES('2016-1-5');
INSERT INTO test.test1 VALUES('2016-12-5');
INSERT INTO test.test1 VALUES('2016-12-6');
クエリ結果を選択します。
SELECT * FROM test.test1
date_start
------------
2016-1-5
2016-1-5
2016-12-5
2016-12-6
列VARCHARをDATEに変更
ALTER TABLE test.test1 CHANGE date_start date_start DATE NULL;
クエリ結果を選択します。
SELECT * FROM test.test1
date_start
------------
2016-01-05
2016-01-05
2016-12-05
2016-12-06