2009-02-25 62 views
6

Trong oracle, là múi giờ được đặt tên luôn được lưu trữ?Oracle TIMESTAMP VỚI TIMEZONE có tên là zone vs offset

Tôi đã được thử nghiệm cột này trong hệ thống của chúng tôi, và ở một số nơi dấu thời gian được hiển thị như:

26-FEB-09 11.36.25.390713 AM +13:00 

nhưng thời điểm khác đó là:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland 

Nếu giá trị được lưu trữ như trước đây, điều đó có nghĩa là múi giờ thực tế không được lưu trữ?

Tôi lo lắng vì nếu một ngày trong tương lai được lưu trữ chỉ với chênh lệch, chúng tôi có thể không xác định được thời gian thực trong múi giờ ban đầu, vì bạn có thể xác định chênh lệch từ múi giờ, nhưng không ngược lại.

Cảm ơn

Trả lời

2

Tôi đã phát hiện ra rằng việc thiết lập TimeZone và định dạng trong ODP.NET khi một kết nối được mở ra dường như để giải quyết vấn đề này:

OracleGlobalization info = conn.GetSessionInfo(); 
info.TimeZone = "Pacific/Auckland"; 
info.TimeStampFormat = "DD-MON-YYYY HH:MI:SS.FF AM"; 
info.TimeStampTZFormat = "DD-MON-YYYY HH:MI:SS.FF AM TZR"; 
conn.SetSessionInfo(info); 
8

Đó là khá dễ dàng để kiểm tra

create table foo (tswtz TIMESTAMP WITH TIME ZONE); 
    /

insert into foo values (TO_TIMESTAMP_TZ ('21-FEB-2009 18:00:00 -5:00', 'DD-MON-YYYY HH24:MI:SS TZH:TZM')); 


insert into foo values (TO_TIMESTAMP_TZ ('21-FEB-2009 18:00:00 EST', 'DD-MON-YYYY HH24:MI:SS TZR')); 
    select tswtz, extract(timezone_abbr from tswtz), extract(TIMEZONE_REGION from tswtz) 
from foo; 


TSWTZ   EXTRACT(TIMEZONE_ABBRFROMTSWTZ) EXTRACT(TIMEZONE_REGIONFROMTSWTZ)         
------------- ------------------------------- ---------------------------------------------------------------- 
21-FEB-09 06.00.00.000000000 PM -05:00 UNK       UNKNOWN               
21-FEB-09 06.00.00.000000000 PM EST  EST        EST                

2 rows selected 

Nó lưu trữ những gì bạn nói với nó. Nếu bạn nói với nó một sự bù đắp, sự bù đắp đó có thể tốt cho một hoặc nhiều múi giờ, vậy tại sao nó lại chỉ chọn một?

+0

OK, mát mẻ, đó là những gì tôi đã mong đợi. Vì vậy, nói rằng tôi có cột "được tạo" mà tôi muốn có giá trị mặc định của dấu thời gian hiện tại. Hiện tại trong DB của tôi, một cuộc gọi đến systimestamp trả về dấu thời gian có bù trừ. Làm cách nào để thay đổi điều này để sử dụng múi giờ được đặt tên? Cảm ơn – tobyc

+0

Whoa ... Oracle trả lại nội dung bạn yêu cầu trả lại. Bất kỳ hành vi mặc định nào là mặc định. Không bao giờ dựa vào mặc định, luôn luôn rõ ràng. Và tôi không nghĩ rằng systimestamp có nhưng chọn to_char (systimestamp, 'YYYYMMDD HH24: MI: SS.FF TZR') || '' || SESSIONTIMEZONE từ ý chí kép. –

+0

chọn trích xuất (TIMEZONE_REGION từ systimestamp) từ kết quả kép trong UNKNOWN –

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