Có một chút nhầm lẫn trong câu hỏi của bạn:
- một
Datekiể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 ZONEthà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_CHARhàm số. Trong Oracle, aDatekhô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ộtVARCHAR2tới mộtTIMESTAMP, nhưng điều này sẽ không chuyển đổiDatetớ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,
CSTlà một múi giờ nhưngCDTkhông phải.CDTlà 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ờCSTsẽ 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