Nếu dữ liệu đã có trong bảng Oracle SQL và bạn phải chuyển đổi sang dấu thời gian với múi giờ (ví dụ:trong cột mới bạn đã tạo trong cùng một bảng), bạn không cần phải chuyển đến Hệ điều hành một cách rõ ràng hoặc sử dụng Java hoặc bất kỳ thứ gì khác, ngoài chính cơ sở dữ liệu Oracle.
Không rõ từ câu hỏi của bạn nếu bạn phải giả định "ngày" được cho là nằm trong múi giờ máy chủ (bạn đề cập đến "cơ sở dữ liệu" thường có nghĩa là máy chủ) hay múi giờ máy khách (bạn đề cập đến "phiên" có nghĩa là khách hàng). Dù bằng cách nào:
update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;
hoặc sử dụng sessiontimezone
là đối số thứ hai, nếu đó là những gì bạn cần.
Điều này giả định rằng múi giờ của cơ sở dữ liệu (và / hoặc phiên) được thiết lập đúng cách trong db, tương ứng trong máy khách. Nếu nó không phải / chúng không, điều đó cần được khắc phục trước tiên. Oracle hoàn toàn có khả năng xử lý thời gian tiết kiệm ban ngày, nếu các thông số được thiết lập chính xác ngay từ đầu. (Và nếu không, không rõ tại sao bạn lại cố gắng làm cho hoạt động của mình "đúng hơn" so với cơ sở dữ liệu hỗ trợ ngay từ đầu.)
Ví dụ:trong mệnh đề VỚI bên dưới, tôi mô phỏng một bảng có cột dt
trong kiểu dữ liệu date
. Sau đó, tôi chuyển đổi đó thành timestamp with time zone
, theo múi giờ của phiên (khách hàng) của tôi.
with
my_table ( dt ) as (
select to_date('2018-06-20 14:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual
)
select dt,
from_tz(cast(dt as timestamp), sessiontimezone) as ts_with_tz
from my_table
;
DT TS_WITH_TZ
------------------- -------------------------------------------------
2018-06-20 14:30:00 2018-06-20 14:30:00.000000000 AMERICA/LOS_ANGELES