Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

TO_DATE () Hàm trong Oracle

Trong Cơ sở dữ liệu Oracle, TO_DATE() hàm chuyển đổi đối số của nó thành giá trị DATE kiểu dữ liệu.

Cú pháp

Cú pháp như sau:

TO_DATE(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 chỉ định định dạng của char . Nếu bạn bỏ qua fmt , rồi đến char phải ở định dạng ngày mặc định. Định dạng ngày mặc định được xác định bởi NLS_DATE_FORMAT tham số khởi tạo, bản thân nó được đặt ngầm bởi NLS_TERRITORY , nhưng cũng có thể được đặt một cách rõ ràng (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_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR'
    )
FROM DUAL;

Kết quả:

25/AUG/30

Định dạng của kết quả được xác định bởi NLS_DATE_FORMAT trong phiên của bạn tham số. Chúng tôi có thể kiểm tra giá trị của NLS_DATE_FORMAT bằng cách truy vấn V$NLS_PARAMETERS xem:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_DATE_FORMAT';

Kết quả:

DD/MON/RR

Giá trị mặc định của NLS_TIMESTAMP_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() một lần nữa:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR'
    )
FROM DUAL;

Kết quả:

25-AUG-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_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_DATE(
        '25-AUG-30'
    )
FROM DUAL;

Kết quả:

25-AUG-30

Khi thực hiện việc này, đối số phải ở định dạng mặc định của DATE kiểu dữ liệu, được xác định bởi NLS_DATE_FORMAT tham số khởi tạo.

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_DATE(
        '2030-08-25'
    )
FROM DUAL;

Kết quả:

Error report -
ORA-01861: literal does not match format string

Để 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_DATE_FORMAT tham số.

Thông thường không tốt nếu bỏ qua mô hình định dạng. Nói cách khác, bạn nên luôn cung cấp mô hình định dạng khi sử dụng chức năng này. Dưới đây là danh sách đầy đủ các phần tử định dạng ngày giờ có thể được sử dụng khi tạo mô hình định dạng.

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 DATE loại.

Ví dụ:

SET NULL 'null';
SELECT 
    TO_DATE(
    '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.

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_DATE(
        '25-agosto-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Kết quả:

25-AUG-30

Lưu ý rằng kết quả vẫn được trả về theo NLS_DATE_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_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        '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_DATE(
        '25-August-2030', 
        'DD-Month-RRRR',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Kết quả:

25-AUG-30

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_DATE(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_DATE()
FROM DUAL;

Kết quả:

SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Và việc chuyển quá nhiều đối số cũng dẫn đến lỗi:

SELECT 
    TO_DATE(
        '25-Aug-2030', 
        'DD-Mon-RRRR',
        'NLS_DATE_LANGUAGE = English',
        'Gosh',
        'Dang'
    )
FROM DUAL;

Kết quả:

SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ojdbc14.jar so với ojdbc6.jar

  2. Giới thiệu Trình điều khiển Easysoft Oracle® vào Môi trường SOA của bạn

  3. Trả lại giá trị từ tập lệnh sql sang tập lệnh shell

  4. Trình kiểm tra cú pháp SQL trực tuyến phù hợp với nhiều cơ sở dữ liệu

  5. Sử dụng các giao dịch lồng nhau trong oracle