2009-11-03 39 views
10

Bakground: Tôi đã có ứng dụng cũ mà tôi đang sử dụng để sử dụng các loại DATE cho phần lớn thời gian lưu trữ trong cơ sở dữ liệu. Tôi muốn thử cập nhật một số bảng này để chúng có thể sử dụng múi giờ vì điều này đang gây ra sự cố với người dùng ở các khu vực khác nhau từ nơi db (xem A bên dưới). Điều này là dành cho Oracle 10g.Di chuyển các cột Oracle DATE thành TIMESTAMP với múi giờ

Quetions:

1) Tôi có thể di chuyển "tại chỗ" không. Tôi có thể chuyển đổi như vậy

DATE_COL = type:DATE => DATE_COL = type:TIMESTAMP 

... hoặc tôi sẽ phải sử dụng tên cột khác?

Hãy nhớ rằng dữ liệu cần được giữ lại. Nếu điều này có thể được thực hiện bán dễ dàng trong một kịch bản di chuyển nó sẽ làm việc cho mục đích của tôi.

2) Loại chuyển đổi này có tương thích ngược không? Chúng tôi có thể có một số tập lệnh hoặc báo cáo sẽ nhấn vào bảng này mà chúng tôi có thể không biết. Có lẽ chúng ta có thể đối phó với nó nhưng tôi muốn biết loại tổ ong nào mà tôi đang bước vào.

3) Tôi nên theo dõi những cạm bẫy nào?

Cảm ơn,

EDIT:
(một phần để đáp ứng với Gary)

Tôi tốt với một quá trình gồm nhiều bước.

1) di chuyển dữ liệu sang cột Dấu thời gian mới (TEMP được điều chỉnh) với một số loại chuyển đổi 2) thả cột cũ (chúng tôi gọi nó là MY_DATE) 3) tạo cột dấu thời gian mới với tên cột ngày cũ (MY_DATE) dữ liệu 4) di chuyển đến cột MY_DATE 5) thả cột TEMP

Một Gary cũng muốn làm rõ về vấn đề múi giờ cụ thể. Tôi đã sao chép câu trả lời của tôi từ bên dưới để giữ cho nó dễ đọc hơn.

Về cơ bản, dữ liệu sẽ được truy cập từ một số khu vực khác nhau. Chúng tôi cần có khả năng chuyển đổi sang/từ múi giờ địa phương nếu cần. Chúng tôi cũng có các bộ kích hoạt sử dụng sysdate làm phức tạp thêm những thứ. dấu thời gian với múi giờ làm giảm rất nhiều nỗi đau này.

Oh và cảm ơn câu trả lời cho đến thời điểm này.

Trả lời

14

Bạn chỉ có thể chạy:

ALTER TABLE your_table MODIFY your_date_column TIMESTAMP WITH TIME ZONE; 

Nhưng tôi sẽ khuyên bạn nên thêm một cột dấu thời gian để bàn, sử dụng một câu lệnh UPDATE để cư trú, và thả các cột ngày đầu tiên nếu bạn lựa chọn:

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); 

Chuyển đổi tương thích ngược - bạn có thể chuyển đổi lại & tùy ý muốn.

+0

Tôi đoán những gì tôi muốn làm rõ là nếu tôi thay thế các cột với một tem thời gian (như tôi mô tả trong bản cập nhật của tôi), sẽ báo cáo và truy vấn sử dụng các lĩnh vực này choke trên một dấu thời gian? (Điều này sẽ được đọc chỉ) Tôi có thể xem xét một dấu thời gian là một lớp con của ngày hoặc có đủ tinh tế oracle để làm cho rằng một giả định rất xấu? –

+0

'TIMESTAMP' là một kiểu dữ liệu khác - các báo cáo và truy vấn sẽ phải được xem xét để tác động. Nó không phải là db sẽ "nghẹt thở", nhưng các chức năng/etc có khả năng không được linh hoạt trên datatype vì vậy họ sẽ phải được cập nhật cho phù hợp. –

+0

'TIMESTAMP' không ghi lại múi giờ là câu hỏi cần thiết. Bạn nên sử dụng 'TIMESTAMP WITH TIME ZONE' hoặc' TIMESTAMP WITH LOCAL TIME ZONE'. Xem http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch4datetime.htm. Trước đây lưu trữ ngày và múi giờ trong cột trong khi sau đó lưu trữ ngày được chuẩn hóa theo múi giờ cơ sở dữ liệu, nhưng dịch nó thành thời gian phiên người dùng khi người dùng truy vấn cột. –

6

đủ đơn giản để chứng minh

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. 

Vì vậy, bạn có thể đi từ ngày đến timestamp (hoặc dấu thời gian với múi giờ địa phương) và ngược lại, nhưng không phải cho timestamp với múi giờ (tức là nơi bù đắp được tồn). Bạn sẽ phải thêm cột khác và sao chép dữ liệu hiện có qua (với mặc định cho múi giờ thích hợp).

"gây ra sự cố với người dùng ở các khu vực khác nhau từ nơi mà db". Có thể giúp đỡ cụ thể hơn một chút. Có đủ để chuyển đổi ngày (hoặc dấu thời gian) từ múi giờ cơ sở dữ liệu sang múi giờ của người dùng khi chèn/thay đổi/truy vấn hay bạn thực sự cần phải lưu giữ thực tế rằng bản ghi được tạo lúc 3 giờ chiều trong một múi giờ cụ thể.

+0

"gây ra sự cố với người dùng ở các khu vực khác nhau từ nơi mà db là" Về cơ bản dữ liệu sẽ được truy cập từ nhiều khu vực khác nhau. Chúng tôi cần có khả năng chuyển đổi sang/từ múi giờ địa phương nếu cần. CHÚNG TÔI cũng có những tác nhân kích thích sử dụng sysdate làm phức tạp thêm nhiều thứ. dấu thời gian với múi giờ làm giảm rất nhiều nỗi đau này. –

+0

Dấu thời gian có múi giờ LOCAL có giải quyết được sự cố không. Nếu vậy, đó là giải pháp dễ nhất để thực hiện. –

+2

PS. Khi bạn trừ một ngày từ một ngày khác, bạn sẽ nhận được câu trả lời bằng số trong ngày. Với dấu thời gian, bạn sẽ nhận được một kiểu dữ liệu INTERVAL. Đó là một trong những lỗ hổng để tìm kiếm –

Các vấn đề liên quan