web-dev-qa-db-ja.com

MySQLでVARCHARをDATEに切り替える

本当にDATEであるべきVARCHAR列を持つデータベースを継承しました。フォームのチェックはありません(修正する必要があります)。そのため、日付は常に2016-12-04などではなく2016-12-4として入力されます。

歴史的に悪い日付がたくさんあると確信しているので、データ型をDATEに変更することについては少し慎重ですが、それを変更するための適切な戦略は何ですか?

背景:(私はDBAではなくフロントエンド開発者なので、SQLを回避することはできますが、何がわからないのかわからず、間違いを犯して間違いを犯します。データベース)。

6
Robusto

str_to_date() を使用して変換を処理します。

str_to_date('2016-12-4', '%Y-%m-%d'); 
5
Evan Carroll

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列にインデックスを付けると、特定のクエリが高速になります。

4
Rick James

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  
2
Raymond Nijland