Có một chút nhầm lẫn trong câu hỏi của bạn:
- một
Date
kiểu dữ liệu không lưu thành phần múi giờ. Phần thông tin này bị cắt ngắn và mất vĩnh viễn khi bạn chènTIMESTAMP WITH TIME ZONE
thành mộtDate
. - Khi bạn muốn hiển thị một ngày, trên màn hình hoặc để gửi nó đến một hệ thống khác thông qua API ký tự (XML, tệp ...), bạn sử dụng
TO_CHAR
hàm số. Trong Oracle, aDate
không có định dạng :đó là một thời điểm. - Có đi có lại, bạn sẽ sử dụng
TO_TIMESTAMP_TZ
để chuyển đổi mộtVARCHAR2
tới mộtTIMESTAMP
, nhưng điều này sẽ không chuyển đổiDate
tới mộtTIMESTAMP
. - Bạn sử dụng
FROM_TZ
để thêm thông tin múi giờ vàoTIMESTAMP
(hoặc mộtDate
). - Trong Oracle,
CST
là một múi giờ nhưngCDT
không phải.CDT
là thông tin tiết kiệm ánh sáng ban ngày. - Để làm phức tạp thêm mọi thứ, hãy
CST/CDT
(-05:00
) vàCST/CST
(-06:00
) rõ ràng sẽ có các giá trị khác nhau, nhưng múi giờCST
sẽ kế thừa thông tin tiết kiệm ánh sáng ban ngày tùy thuộc vào ngày theo mặc định.
Vì vậy, chuyển đổi của bạn có thể không đơn giản như vẻ ngoài.
Giả sử rằng bạn muốn chuyển đổi Date
d
mà bạn biết là hợp lệ tại múi giờ CST/CST
tương đương với múi giờ CST/CDT
, bạn sẽ sử dụng:
SQL> SELECT from_tz(d, '-06:00') initial_ts,
2 from_tz(d, '-06:00') at time zone ('-05:00') converted_ts
3 FROM (SELECT cast(to_date('2012-10-09 01:10:21',
4 'yyyy-mm-dd hh24:mi:ss') as timestamp) d
5 FROM dual);
INITIAL_TS CONVERTED_TS
------------------------------- -------------------------------
09/10/12 01:10:21,000000 -06:00 09/10/12 02:10:21,000000 -05:00
Định dạng dấu thời gian mặc định của tôi đã được sử dụng ở đây. Tôi có thể chỉ định định dạng một cách rõ ràng:
SQL> SELECT to_char(from_tz(d, '-06:00'),'yyyy-mm-dd hh24:mi:ss TZR') initial_ts,
2 to_char(from_tz(d, '-06:00') at time zone ('-05:00'),
3 'yyyy-mm-dd hh24:mi:ss TZR') converted_ts
4 FROM (SELECT cast(to_date('2012-10-09 01:10:21',
5 'yyyy-mm-dd hh24:mi:ss') as timestamp) d
6 FROM dual);
INITIAL_TS CONVERTED_TS
------------------------------- -------------------------------
2012-10-09 01:10:21 -06:00 2012-10-09 02:10:21 -05:00