programing

표준 시간대를 사용하여 오라클 DATE 열을 타임스탬프

lastcode 2023. 10. 19. 22:21
반응형

표준 시간대를 사용하여 오라클 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

반응형