2011-11-11 4 views
2

나는 날짜 열이 character(50) 개의 필드로 캐스팅 된 레거시 포스트그레스 DB를 가지고 있습니다 (묻지 않음). 나는 실제 날짜를 포함하기 위해 테이블과 컬럼을 변경하고 싶다. 이 일 때문에 :지금까지 문자 필드 변경

alter table dates alter column date_begin type character 
using to_date(date_begin, 'YYYY DD MM'); 

을하지만 그렇지 않습니다 :

select distinct to_date(date_begin, 'YYYY DD MM') from dates; 

을 나는 순진하게도이 작동하지 않을 수 있습니다 생각했다. 우둔한 사람들을위한 단서?

+1

새 날짜 열을 추가하고 이전 열의 데이터를 새 열로 마이그레이션하고 데이터가 올바른지 확인한 다음 이전 열을 삭제하고 새 열의 이름을 이전 이름으로 바꾸는 것이 좋지 않습니까? –

+0

@ 짐함. 이것은 다른 RDBMS로 갈 수있는 방법 일 수 있습니다. 또한 열에 따라 인덱스, 외래 키, 뷰 등을 관리해야합니다. 그러나 PostgreSQL에서는 OP에 의해 의도 된대로 작동합니다 *. 더 많은 것을 위해 나의 대답을 보라. –

답변

4

은 OP가 의도 한대로으로 작동합니다. 우리가 가진 것은 단순한 thinko/typo입니다.
manual about ALTER TABLE에 대한 자세한 내용을 읽어보십시오.
데모 :

-- DROP SCHEMA x CASCADE; 
CREATE SCHEMA x; 
CREATE TABLE x.tbl(date_begin character(50)); 
INSERT INTO x.tbl VALUES ('2011-11-11 11:11'), (NULL), (''), ('1977'); 
-- NULL and empty string work too 
-- even just YYYY works: '1977' .. is converted to '1977-01-01' automatically 
-- empty string produce a possibly surprising result: '0001-01-01 BC' 

ALTER TABLE x.tbl ALTER COLUMN date_begin TYPE date USING to_date(date_begin, 'YYYY DD MM'); 

SELECT * FROM x.tbl; 

힌트 : 당신은 type character 대신 type date 썼다.

+0

사실/오타. 감사. 나는 당신의 실험을 시도했고 그것은 잘 작동했다. 그러나, 내 테이블 public.dates에 그것을 시도하고 나는 아무것도 얻지 않는다. 나는 테이블을 소유하고 있고 테이블을 만들 수 있지만 psql 프롬프트에서이 작업을 수행 할 수 있습니다 : ALTER TABLE dates ALTER COLUMN date_begin TYPE date USING to_date (date_begin, 'YYYY DD MM'); 내가 도대체 ​​뭘 잘못하고있는 겁니까? (참고 : date_begin에는 많은 null 값이 있습니다. 문제가 있습니까?) – jjon

+0

@jjon : NULL 값은 확실히 문제가되지 않습니다. 데모에서 NULL 값을 포함하도록 수정했습니다. NULL 값도 포함되어 있습니다. 빈 문자열조차도이 작업을 실패하게 만듭니다 (놀라운 날짜를 생성하는 동안). –

+0

@jjon : 여전히 작동하지 않는 것 같으면 테이블 이름이나 스키마가 섞여 있는지 궁금합니다. 그 진단에 대한 도움을 찾으려면 다음을보십시오. http://stackoverflow.com/questions/8039116/adding-a-user-accounts-table-to-postgres-in-django-view/8074877#8074877 –

0

3 단계가 필요합니다.

1) 날짜 열을 추가하려면 테이블을 변경하십시오.

2) 날짜 필드

3) 텍스트 날짜 열을 제거하기 위해 테이블을 변경에 각 문자열 날짜를 변환하는 업데이트 쿼리를 실행합니다.

+0

이 것은 필요하지 않습니다. –