표준 시간대를 사용하여 오라클 DATE 열을 타임스탬프
바탕:데이터베이스의 대부분 시간 저장을 위해 DATE 유형을 사용하는 레거시 앱이 있습니다.db가 있는 곳과 다른 지역의 사용자들에게 문제가 발생하고 있기 때문에 이 테이블들 중 일부를 시간대를 활용할 수 있도록 업데이트를 시도하고 싶습니다(아래 A 참조).오라클 10g용입니다.
질문:
1) "제자리"로 옮길 수 있을까요?그렇게 변환해도 됩니까?
DATE_COL = type:DATE => DATE_COL = type:TIMESTAMP
...아니면 다른 열 이름을 사용해야 합니까?
데이터를 보존해야 한다는 것을 명심해야 합니다.마이그레이션 스크립트에서 이 작업을 반쯤 쉽게 수행할 수 있다면 제 목적에 맞게 작업할 수 있을 것입니다.
2) 이러한 변환 유형이 하위 호환됩니까?이 테이블에 도달할 스크립트나 보고서가 있을 수도 있지만 이에 대해 알지 못할 수도 있습니다.우리는 아마 그것을 처리할 수 있을 것입니다만, 저는 제가 어떤 종류의 말벌 둥지로 걸어 들어가는지 알고 싶습니다.
3) 제가 주의해야 할 함정은 무엇을 조심해야 합니까?
감사해요.
편집:
(일부는 개리에 대한 응답으로)
여러 단계의 절차를 거치면 저는 괜찮습니다.
1) 데이터를 일종의 변환이 있는 새 타임스탬프 열(TEMP라고 함)로 이동 2) 이전 열(MY_DATE라고 함 3) 이전 날짜 열 이름(MY_DATE)으로 새 타임스탬프 열 생성 4) 데이터를 MY_DATE 열로 이동 5) 삭제 TTEMP 열
개리는 구체적인 시간대 문제에 대해서도 해명을 원했습니다.저는 제 답변을 좀 더 가독성 있게 하기 위해 아래에서 복사했습니다.
기본적으로 데이터는 여러 다른 영역에서 액세스됩니다.우리는 필요에 따라 현지 시간대로 전환할 수 있어야 합니다.우리는 또한 sysdate를 사용하는 더 복잡한 것들을 사용하는 트리거들을 가지고 있습니다.타임스탬프와 시간대를 사용하면 이러한 고통이 상당 부분 완화됩니다.
아 그리고 지금까지 답변해주셔서 감사합니다.
그냥 도망쳐도 됩니다.
ALTER TABLE your_table MODIFY your_date_column TIMESTAMP WITH TIME ZONE;
하지만 테이블에 TIMESTAMP 열을 추가하고 UPDATE 문을 사용하여 채워 넣은 후 다음을 선택하는 경우 원래 날짜 열을 삭제하는 것이 좋습니다.
ALTER TABLE your_table ADD date_as_timestamp TIMESTAMP WITH TIME ZONE;
UPDATE your_table
SET date_as_timestamp = CAST(date_column AS TIMESTAMP WITH TIME ZONE);
변환은 역호환이 가능합니다. 원하는 대로 앞뒤로 전환할 수 있습니다.
시연하기에 충분할 정도로 간단함
SQL> create table x (y date);
Table created.
SQL> insert into x select sysdate from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter table x modify y timestamp;
Table altered.
SQL> select * from x;
Y
---------------------------------------------------------------------------
03/NOV/09 12:49:03.000000 PM
SQL> alter table x modify y date;
Table altered.
SQL> select * from x;
Y
---------
03/NOV/09
SQL> alter table x modify y timestamp with time zone;
alter table x modify y timestamp with time zone
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype
SQL> alter table x modify y timestamp with local time zone;
Table altered.
SQL> alter table x modify y date;
Table altered.
따라서 날짜에서 타임스탬프(또는 로컬 표준 시간대를 사용한 타임스탬프)로 이동하고 다시 돌아갈 수 있지만 시간대를 사용한 타임스탬프(즉, 오프셋이 지속되는 경우)는 사용할 수 없습니다.다른 열을 추가하고 기존 데이터를 적절한 표준 시간대에 대한 기본값으로 복사해야 합니다.
"db가 있는 곳과 다른 지역의 사용자에게 문제를 야기합니다."좀 더 구체적으로 설명하는 데 도움이 될 겁니다.삽입/변경/질의 시 데이터베이스 시간대에서 사용자의 시간대로 날짜(또는 타임스탬프)를 변환하는 것으로 충분합니까, 아니면 레코드가 특정 시간대에서 오후 3시에 생성되었다는 사실을 실제로 유지해야 합니까?
언급URL : https://stackoverflow.com/questions/1664627/migrating-oracle-date-columns-to-timestamp-with-timezone
'programing' 카테고리의 다른 글
매크로가 정의되어 있고 동시에 특정 값과 동일한지 확인할 수 있는 방법이 있습니까? (0) | 2023.10.19 |
---|---|
Insert 트리거를 설정하여 최대값을 다른 열에 저장합니다. (0) | 2023.10.19 |
sql 덤프 파일에서 mariadb를 업그레이드하는 방법은? (0) | 2023.10.19 |
정규 표현식에서 'g' 깃발의 의미는 무엇입니까? (0) | 2023.10.19 |
마이그레이션을 실행할 때 "해당 파일 또는 디렉터리 없음" 또는 "해당 호스트를 알 수 없음" (0) | 2023.10.19 |