2014-09-20 5 views
2

MySql 테이블에 varchar 유형의 _time 열이 있습니다. 그래서 나는이 일을 해요 201409201945 내가 datetime로 변환 할 : 다음 공백없이 year month day hour minute :varchar를 MySql의 datetime으로 변환 할 수 없습니다.

ALTER TABLE `my_table` CHANGE COLUMN `_time` `date_time` DATETIME NOT NULL; 

그리고 어떤 이유로이 오류가 발생합니다 : 그것은 보유 값은 형식에

Error Code: 1292. Incorrect datetime value: '201409201945' for column '_date_time' at row 1 0.036 sec

+2

올바른 유형의 새 열을 추가하고 적절한 데이터 변환을 수행하는 업데이트를 실행 한 다음 이전 열을 삭제합니다. –

+0

@Arkain은 올바른 날짜 형식입니까? –

+0

@Arkain 사용자가 기존 데이터를 사용하여 어떻게 업데이트합니까? (구 형식 데이터) –

답변

6

세 단계를 변경 시도, 여기에 발췌 내가 사용 :

%d Day of the month, numeric (00..31) 
%H Hour (00..23) 
%i Minutes, numeric (00..59) 
%m Month, numeric (00..12) 
%Y Year, numeric, four digits 

Demo of the UPDATE

, 새로운 열 말아야가하면 속성 NOT NOLL이 D, 한 가지 방법 '을 작동하기 전에 SQL 모드를 설정할 수'나중에 sql_mode을 리셋 :

SET @old_mode = @@sql_mode; 
SET @@sql_mode = '';  -- permits zero values in DATETIME columns 

ALTER TABLE `my_table` ADD COLUMN `date_time` DATETIME NOT NULL; 
UPDATE `my_table` SET `date_time` = STR_TO_DATE(`_time`, '%Y%m%d%H%i'); 
ALTER TABLE `my_table` DROP COLUMN `_time`; 

SET @@sql_mode = @old_mode; 

Updated Demo

+0

@ GordonLinoff 매우 사실, 그 생각이없는 복사 및 붙여 넣기 오류가 해결되었습니다. – VMai

+0

@GordonLinoff 방금 시도했지만 오류가 없습니다. 기존 행의 새 열 값의 기본값은 '0000-00-00 00:00:00' – abl

+0

입니다. '% Y % m % d % H % i'에 "i"가 있는지 확인하십시오. –

0

데이터베이스가 201409201945로 무엇을 해야할지하지 않기 때문에, 유효한 날짜 시간 형식이 아니다, 그러므로 그것은

당신은 데이터 t를 삭제할 수 있습니다 변경할 수 없습니다 모자는 이미이며, 다음 STR_TO_DATE

-- add the new column 
ALTER TABLE `my_table` ADD COLUMN `date_time` DATETIME; 

-- update the new column with the help of the function STR_TO_DATE 
UPDATE `my_table` SET `date_time` = STR_TO_DATE(`_time`, '%Y%m%d%H%i'); 

-- drop the old column 
ALTER TABLE `my_table` DROP COLUMN `_time`; 

STR_TO_DATE에 대한 지정자의 전체 목록은 DATE_FORMAT에서 찾을 수있는 기능의 도움이 될 것입니다 그것을 언급 @Arkain

+0

이것은 답이 아닙니다. 질문 –

+0

아래의 코멘트는 OP의 의도가 아니므로 확실합니다. – VMai

+0

변환 코드를 작성하면이를 명시해야합니다. –

1

당신의 varchar 데이터가이 같은 형식한다면 ' 2014-09-20 19:45 '열의 데이터 형식을 변경하면 작동합니다. 왜? 그것은 DATETIME 및 기타 시간 중심 데이터 유형에서 사용하는 문자 표현입니다.

하지만 그렇지 않습니다. 그래서, 당신은 무엇을 선택합니까?

  • ALTER 해당 컬럼의 값을 입력 할 수없는 WHERE 조항이있는 UPDATE을 임시 이름으로 새 DATETIME 열을 추가 할 테이블을 변경

    1. : 하나는이 네 단계를 사용하는 것입니다 이전 열을 삭제할 테이블
    2. 테이블을 변경하여 새 열의 이름을 방금 삭제 한 열과 동일한 이름으로 변경합니다.

    어떻게 될까요?

    ALTER TABLE my_table ADD COLUMN tempstamp DATETIME 
    UPDATE my_table SET tempstamp = STR_TO_DATE(_time, '%Y%m%d%H%i') 
    ALTER TABLE my_table DROP COLUMN _time 
    ALTER TABLE my_table CHANGE tempstamp _time DATETIME NOT NULL 
    

    또 다른 방법 : 다음, 당신의 _time에 유효한 날짜 시간 값의 문자열을 변경하여 열을 변경합니다. varchars()이 몇 개의 추가 문자를 저장할만큼 충분히 넓은 경우이 방법을 사용하십시오.

    UPDATE my_table SET `_time`=STR_TO_DATE(`_time`, '%Y%m%d%H%i') 
    ALTER TABLE my_table CHANGE `_time` `_time` DATETIME NOT NULL 
    

    STR_TO_DATE()이 문자열의 DATETIME 값을 만들고, 다음 MySQL이 다시 varchar 컬럼에 저장하는 문자열로 다시 캐스트 때문에이 작동합니다. 그런 다음 데이터 유형을 DATETIME으로 변경할 수 있습니다.

    아마도 나는 NOT NULL에 던졌습니다. 해당 열에 인덱스를 넣으려면 NOT NULL을 사용하는 것이 좋습니다. 그러나 시간 값 중 일부가 누락되면 작동하지 않습니다.

  • 관련 문제