Trong Cơ sở dữ liệu Oracle, TO_TIMESTAMP_TZ()
hàm chuyển đổi đối số của nó thành giá trị TIMESTAMP WITH TIME ZONE
kiểu dữ liệu.
Cú pháp
Cú pháp như sau:
TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
[, fmt [, 'nlsparam' ] ])
Các ký tự char
đối số có thể là bất kỳ biểu thức nào đánh giá thành một chuỗi ký tự của CHAR
, VARCHAR2
, NCHAR
hoặc NVARCHAR2
kiểu dữ liệu.
fmt
tùy chọn đối số chỉ định định dạng của char
. Nếu bạn bỏ qua fmt
, rồi đến char
phải ở định dạng mặc định của TIMESTAMP WITH TIME ZONE
kiểu dữ liệu, được xác định bởi NLS_TIMESTAMP_TZ_FORMAT
tham số khởi tạo (xem Cách Kiểm tra Định dạng Ngày của Phiên Oracle của bạn).
'nlsparam'
tùy chọn đối số chỉ định ngôn ngữ mà tên tháng và ngày và chữ viết tắt được cung cấp. Nó có dạng sau:
'NLS_DATE_LANGUAGE = language'
Ví dụ
Dưới đây là một ví dụ cơ bản để chứng minh:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
Kết quả:
25/AUG/30 06:10:35.123456789 PM +09:30
Định dạng của kết quả được xác định bởi NLS_TIMESTAMP_TZ_FORMAT
trong phiên của bạn tham số. Chúng tôi có thể kiểm tra giá trị của NLS_TIMESTAMP_TZ_FORMAT
bằng cách truy vấn V$NLS_PARAMETERS
xem:
SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';
Kết quả:
DD/MON/RR HH12:MI:SSXFF AM TZR
Giá trị mặc định của NLS_TIMESTAMP_TZ_FORMAT
tham số bắt nguồn từ NLS_TERRITORY
tham số. Trong trường hợp của tôi, NLS_TERRITORY
tham số là AUSTRALIA
.
Đây là những gì sẽ xảy ra khi tôi thay đổi NLS_TERRITORY
đến một lãnh thổ khác, sau đó gọi TO_TIMESTAMP_TZ()
một lần nữa:
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
)
FROM DUAL;
Kết quả:
25-AUG-30 06.10.35.123456789 PM +09:30
Lần này, kết quả được trả về ở một định dạng khác.
Ngoài ra, bạn có thể thay đổi giá trị của NLS_TIMESTAMP_TZ_FORMAT
tham số trực tiếp. Thao tác này sẽ thay đổi tham số đó mà không ảnh hưởng đến các tham số khác. Xem Cách Thay đổi Định dạng Ngày trong Phiên Oracle của bạn để biết thêm thông tin và ví dụ.
Định dạng mặc định
Trong ví dụ này, tôi bỏ qua fmt
đối số:
SELECT
TO_TIMESTAMP_TZ(
'25-AUG-30 06.10.35.123456789 PM +09:30'
)
FROM DUAL;
Kết quả:
25-AUG-30 06.10.35.123456789 PM +09:30
Khi thực hiện việc này, đối số phải ở định dạng mặc định của TIMESTAMP WITH TIME ZONE
kiểu dữ liệu, được xác định bởi NLS_TIMESTAMP_TZ_FORMAT
tham số.
Dưới đây là một ví dụ về những gì sẽ xảy ra khi chúng tôi chuyển một giá trị không tuân theo định dạng này:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30'
)
FROM DUAL;
Kết quả:
Error report - ORA-01849: hour must be between 1 and 12
Trong trường hợp này, tôi đã chuyển một giá trị sử dụng thời gian 24 giờ, nhưng NLS_TIMESTAMP_TZ_FORMAT
của tôi tham số chỉ định đồng hồ 12 giờ với bộ chỉ định AM / PM.
Để khắc phục điều này, tôi cần phải thay đổi đầu vào của mình hoặc thay đổi giá trị của NLS_TIMESTAMP_TZ_FORMAT
tham số.
Cung cấp Giá trị Mặc định do Lỗi Chuyển đổi
Bạn cũng có tùy chọn cung cấp giá trị để trả về trong trường hợp có lỗi xảy ra khi chuyển đổi đối số thành TIMESTAMP WITH TIME ZONE
loại.
Ví dụ:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(
'Oops!'
DEFAULT null ON CONVERSION ERROR
)
FROM DUAL;
Kết quả:
null
Trong trường hợp này, tôi đã chỉ định rằng null
sẽ được trả lại bất cứ khi nào có lỗi chuyển đổi. Giá trị trả về có thể là một biểu thức hoặc một biến liên kết và nó phải đánh giá thành một chuỗi ký tự của CHAR
, VARCHAR2
, NCHAR
hoặc NVARCHAR2
kiểu dữ liệu hoặc null
. Sau đó, hàm sẽ chuyển đổi nó thành TIMESTAMP WITH TIME ZONE
. Nếu lỗi xảy ra trong quá trình chuyển đổi này, thì lỗi sẽ được trả về.
Về dòng đầu tiên trong ví dụ trên, đây chỉ là để chỉ định những gì sẽ được trả lại cho khách hàng của tôi bất cứ khi nào null
giá trị xảy ra. Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào null
xảy ra do một SELECT
trong SQL tuyên bố.
Tuy nhiên, bạn có thể sử dụng SET NULL
để chỉ định một chuỗi khác được trả về. Ở đây tôi đã chỉ định rằng chuỗi null
nên được trả lại.
'nlsparam'
Đối số
'nlsparam'
tùy chọn đối số chỉ định ngôn ngữ mà tên tháng và ngày và chữ viết tắt được cung cấp. Nó có dạng sau:
'NLS_DATE_LANGUAGE = language'
Ví dụ
SELECT
TO_TIMESTAMP_TZ(
'25-agosto-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Kết quả:
25-AUG-30 06.10.35.123456789 PM +02:00
Lưu ý rằng kết quả vẫn được trả về theo NLS_TIMESTAMP_TZ_FORMAT
của phiên hiện tại tham số. Đó chỉ là đầu vào bằng một ngôn ngữ khác.
Đây là những gì sẽ xảy ra khi tôi thay đổi agosto
đến August
trong khi sử dụng cùng một 'nlsparam'
giá trị:
SELECT
TO_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = SPANISH'
)
FROM DUAL;
Kết quả:
Error report - ORA-01843: not a valid month
Điều này xảy ra vì tôi không cung cấp ngày bằng ngôn ngữ được chỉ định bởi 'nlsparam'
đối số (tiếng Tây Ban Nha).
Thay đổi nó thành English
giải quyết vấn đề này:
SELECT
TO_TIMESTAMP_TZ(
'25-August-2030 18:10:35.123456789 +02:00',
'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English'
)
FROM DUAL;
Kết quả:
25-AUG-30 06.10.35.123456789 PM +02:00
Xem Cách trả lại danh sách các ngôn ngữ được hỗ trợ trong Oracle nếu nó hữu ích.
Đối số rỗng
Chuyển null
kết quả là null
:
SET NULL 'null';
SELECT
TO_TIMESTAMP_TZ(null)
FROM DUAL;
Kết quả:
null
Số lượng đối số không hợp lệ
Việc gọi hàm mà không chuyển bất kỳ đối số nào dẫn đến lỗi:
SELECT TO_TIMESTAMP_TZ()
FROM DUAL;
Kết quả:
Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function"
Tuy nhiên, việc chuyển quá nhiều đối số dường như không gây ra bất kỳ vấn đề nào, miễn là ba đối số đầu tiên hợp lệ:
SELECT
TO_TIMESTAMP_TZ(
'25-Aug-2030 18:10:35.123456789 +09:30',
'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
'NLS_DATE_LANGUAGE = English',
'Oops!',
'Dang!',
'Homer',
'Symptom'
)
FROM DUAL;
Kết quả:
25-AUG-30 06.10.35.123456789 PM +09:30