Trong Cơ sở dữ liệu Oracle, múi giờ có thể được đặt ở nhiều nơi khác nhau. Dưới đây là bốn cách để thay đổi múi giờ khi sử dụng Oracle.
Đặt Múi giờ cho Cơ sở dữ liệu
Bạn có thể đặt múi giờ cơ sở dữ liệu khi tạo cơ sở dữ liệu. Để thực hiện việc này, hãy sử dụng SET TIME_ZONE
mệnh đề của CREATE DATABASE
tuyên bố.
Ví dụ:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Trong trường hợp này, tôi đã sử dụng tên khu vực múi giờ. Xem Cách Trả lại Danh sách Múi Giờ Hợp lệ trong Cơ sở dữ liệu Oracle để có danh sách đầy đủ các tên vùng hợp lệ trên hệ thống của bạn.
Ngoài ra, bạn có thể sử dụng độ lệch múi giờ thực tế:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Nếu bạn không đặt múi giờ một cách rõ ràng khi tạo cơ sở dữ liệu, thì múi giờ đó sẽ được đặt mặc định thành múi giờ của hệ điều hành của máy chủ.
Bạn cũng có thể thay đổi cài đặt múi giờ hiện tại cho cơ sở dữ liệu. Để thực hiện việc này, hãy sử dụng ALTER DATABASE
tuyên bố.
Ví dụ:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Lưu ý rằng múi giờ cơ sở dữ liệu chỉ phù hợp với TIMESTAMP WITH LOCAL TIME ZONE
cột. Ngoài ra, Oracle khuyên bạn nên đặt múi giờ cơ sở dữ liệu thành UTC (0:00) để tránh chuyển đổi dữ liệu và cải thiện hiệu suất khi dữ liệu được chuyển giữa các cơ sở dữ liệu.
Đặt múi giờ của phiên
Bạn có thể đặt múi giờ phiên độc lập với múi giờ cơ sở dữ liệu. Khi bạn quay lại TIMESTAMP WITH LOCAL TIME ZONE
dữ liệu được trả về theo múi giờ của phiên hiện tại.
Múi giờ của phiên cũng có hiệu lực khi TIMESTAMP
giá trị được chuyển đổi thành TIMESTAMP WITH TIME ZONE
hoặc TIMESTAMP WITH LOCAL TIME ZONE
kiểu dữ liệu.
Bạn có thể thực hiện một số việc để đặt múi giờ ở cấp phiên.
T he ORA_SDTZ
Biến môi trường
Bạn có thể đặt múi giờ phiên bằng ORA_SDTZ
biến môi trường. Điều này có thể được đặt thành các giá trị sau:
- Múi giờ địa phương của hệ điều hành (
'OS_TZ'
) - Múi giờ cơ sở dữ liệu (
'DB_TZ'
) - Chênh lệch tuyệt đối so với UTC (ví dụ:
'-04:00'
) - Tên khu vực múi giờ (ví dụ:
'America/St_Kitts'
)
Dưới đây là một số ví dụ về cách đặt biến môi trường này trong môi trường UNIX:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
Giá trị mặc định của ORA_SDTZ
biến là 'OD_TZ'
. Giá trị này được sử dụng khi biến không được đặt hoặc được đặt thành giá trị không hợp lệ.
ALTER SESSION
Tuyên bố
Bạn có thể thay đổi múi giờ cho một phiên SQL cụ thể bằng SET TIME_ZONE
mệnh đề của ALTER SESSION
tuyên bố.
TIME_ZONE
có thể được đặt thành các giá trị sau:
- Múi giờ địa phương mặc định khi phiên bắt đầu (
local
) - Múi giờ cơ sở dữ liệu (
dbtimezone
) - Chênh lệch tuyệt đối so với UTC (ví dụ:
'-04:00'
) - Tên khu vực múi giờ (ví dụ:
'Canada/Eastern'
)
Đây là ví dụ về cài đặt TIME_ZONE
thành các giá trị như vậy:
ALTER SESSION SET TIME_ZONE=local;
ALTER SESSION SET TIME_ZONE=dbtimezone;
ALTER SESSION SET TIME_ZONE='Canada/Eastern';
ALTER SESSION SET TIME_ZONE='-04:00';
Bạn có thể kiểm tra múi giờ của phiên hiện tại của mình bằng SESSIONTIMEZONE
chức năng.
Ví dụ:
SELECT SESSIONTIMEZONE FROM DUAL;
Kết quả:
Australia/Brisbane
Trong trường hợp của tôi, múi giờ phiên được đặt thành Úc / Brisbane.
AT TIME ZONE
Mệnh đề
Biểu thức ngày giờ có thể bao gồm AT LOCAL
hoặc một AT TIME ZONE
mệnh đề. Nếu bạn bao gồm một AT LOCAL
, thì kết quả được trả về trong múi giờ phiên hiện tại. Nếu bạn bao gồm AT TIME ZONE
, thì múi giờ có thể là một trong những điều sau:
- Chênh lệch múi giờ
- Tên khu vực múi giờ
-
DBTIMEZONE
(hàm này trả về múi giờ của cơ sở dữ liệu) -
SESSIONTIMEZONE
(hàm này trả về múi giờ của phiên hiện tại) - Một biểu thức trả về một chuỗi ký tự có định dạng múi giờ hợp lệ.
Ví dụ:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT TIME ZONE '+12:00'
FROM DUAL;
Kết quả:
02/JAN/30 04:30:35.000000000 AM +12:00
Trong trường hợp này, tôi đã sử dụng FROM_TZ()
chức năng chuyển đổi giá trị dấu thời gian và múi giờ thành TIMESTAMP WITH TIME ZONE
giá trị. Sau đó, tôi đã sử dụng AT TIME ZONE
mệnh đề để chỉ định một múi giờ khác.
Đây là ví dụ tương tự, ngoại trừ lần này tôi chỉ định AT LOCAL
:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT LOCAL
FROM DUAL;
Kết quả:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE