2012-11-14 1 views
5

레일에서 open_time이라는 문자열 열을 만들었지 만 datetime 유형을 사용해야한다는 것을 깨달았습니다. 나는 PostgreSQL에서 표준 시간대가 아닌 타임 스탬프로 열 유형을 변경하십시오.

change_column :polls, :open_time, :datetime 

했다 그러나 그것은 말했다 : 난 그냥 문자열 열을 삭제하고 새로운 날짜 열을 추가하는 경우

PG::Error: ERROR: column "open_time" cannot be cast to type timestamp without time zone 
: ALTER TABLE "polls" ALTER COLUMN "open_time" TYPE timestamp 

, 나는 문자열 컬럼에 저장된 데이터를 잃게됩니다. 또한, PostgreSQL의에서 나는 열을 추가 :

ALTER TABLE polls ADD COLUMN published_time timestamp; 

그런 다음 내가 좋아하는 문자열 열에서 데이터를 가져 오기 위해 노력 :

UPDATE polls SET published_time = strToTimeStamp(open_time); 

그래서 내 질문은 어떤 기능을 내가 strToTimeStamp로도 사용할 수 있습니다되는 수 타임 존 타입을 사용하지 않고 문자를 가변하는 타입을 타임 스탬프로 변환합니까?

+2

당신은 ... USING'를 COLUMN을 ALTER'합니다. 예를 들어보십시오 http://stackoverflow.com/search?q=%5Bpostgresql%5D%20ALTER%20COLUMN%20using (dup) –

답변

5

.. 시간대 형식없이 타임 스탬프 문자 다양한 형식을 변환 할 수 있습니다 내가 strToTimeStamp로 사용할 수있는 기능이있다?

to_timestamp()을 사용하면 열의 데이터 유형을 제자리에서 변경할 수 있습니다. 이러한 매우 유사한 질문에서

ALTER TABLE tbl ALTER COLUMN col TYPE timestamp 
USING to_timestamp(col, '<your pattern here>'); 

더 :
Alter character field to date
Cast varchar type to date

-3

데이터베이스의 기능에 의해 제한되므로 사용자가 그렇게 할 수 있다고 생각하지 마십시오. 아이디어는 다음을 수행한다 :

  • 는 다른 이름으로 새 열을 만든
  • 데이터가 각 행
  • 드롭 원래 COL에 대한 변환 후 열 내용을 복사 해
  • 새로운 COL에로 이름을 바꿉니다 원래의 열 이름

이 단계는 동일한 마이그레이션 파일에 배치하여 대/소문자를 구분하지 않고 처리 할 수 ​​있습니다.

+0

당연히 그가 할 수있는, DB의 기능은 그것을 허용합니다. –

+0

네, 맞습니다. DB를 사용하면 capailibity가 가능하지만 레일을 사용하는 것입니다. 심지어 우리는 원시 SQL을 사용하여 레일 이주 내에서 데이터베이스 열을 변경할 수 있습니다. 어떻게 든 프로젝트가 특정 데이터베이스에 초점을두고 있다는 것을 분명히 이해하지 못하는 한 좋은 방법은 아닙니다. –

관련 문제