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

Hàm TRUNC (ngày tháng) trong Oracle

Trong Cơ sở dữ liệu Oracle, TRUNC(date) hàm trả về giá trị ngày đã cho với phần thời gian trong ngày được cắt ngắn thành đơn vị được cung cấp ở mô hình định dạng được chỉ định.

Oracle cũng có một TRUNC(number) cú pháp, được sử dụng trên các số. Bài viết này chỉ nói về TRUNC(date) cú pháp, được sử dụng vào ngày tháng.

Cú pháp

Cú pháp như sau:

TRUNC(date [, fmt ])

date là ngày để cắt bớt và fmt là một mô hình định dạng tùy chọn chỉ định một đơn vị để cắt bớt giá trị. Mô hình định dạng có thể là bất kỳ mô hình định dạng nào được hỗ trợ cho TRUNC(date)ROUND(date) các chức năng.

Hàm hoạt động theo các quy tắc của lịch Gregory (nó không nhạy cảm với giá trị của NLS_CALENDAR tham số).

Ví dụ

Đây là một ví dụ:

SELECT TRUNC(DATE '2035-08-22', 'MONTH')
FROM DUAL;

Kết quả:

01-AUG-35

Đây là một số khác:

SELECT 
    TRUNC(DATE '2035-08-22', 'D') AS "D",
    TRUNC(DATE '2035-08-22', 'DD') AS "DD",
    TRUNC(DATE '2035-08-22', 'MONTH') AS "Month",
    TRUNC(DATE '2035-08-22', 'YEAR') AS "Year",
    TRUNC(DATE '2035-08-22', 'CC') AS "CC"
FROM DUAL;

Kết quả:

           D           DD        Month         Year           CC 
____________ ____________ ____________ ____________ ____________ 
19-AUG-35    22-AUG-35    01-AUG-35    01-JAN-35    01-JAN-01   

Kết quả được định dạng theo định dạng ngày cho phiên hiện tại. Xem Cách kiểm tra định dạng ngày của phiên hiện tại và cách thay đổi định dạng ngày cho phiên hiện tại để biết thêm thông tin về điều đó.

Đơn vị ngày mặc định

Đơn vị ngày mặc định là DD :

SELECT 
    TRUNC(DATE '2035-08-22') AS "Default",
    TRUNC(DATE '2035-08-22', 'DD') AS "DD"
FROM DUAL;

Kết quả:

     Default           DD 
____________ ____________ 
22-AUG-35    22-AUG-35   

So với ROUND()

TRUNC(date) chức năng khác với ROUND(date) hàm số. ROUND() hàm làm tròn ngày trong một số trường hợp và giảm xuống trong một số trường hợp khác. TRUNC() mặt khác, hàm này chỉ đơn giản là cắt ngắn ngày thành đơn vị được chỉ định mà không làm tròn.

Dưới đây là một so sánh để chứng minh sự khác biệt này:

SELECT 
    TRUNC(DATE '2030-12-31', 'MONTH') AS "Trunc",
    ROUND(DATE '2030-12-31', 'MONTH') AS "Round"
FROM DUAL;

Kết quả:

       Trunc        Round 
____________ ____________ 
01-DEC-30    01-JAN-31   

Giá trị rỗng

Nếu một trong hai đối số là null , kết quả là null :

SET NULL 'null';
SELECT 
    TRUNC(null, 'D'),
    TRUNC(date'2020-12-30', null)
FROM DUAL;

Kết quả:

   TRUNC(NULL,'D')    TRUNC(DATE'2020-12-30',NULL) 
__________________ _______________________________ 
              null null                           

Theo mặc định, SQLcl và SQL * Plus trả về một khoảng trống bất cứ khi nào giá trị 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.

Số lượng đối số không hợp lệ

Đang gọi TRUNC() không có đối số dẫn đến lỗi:

SELECT TRUNC()
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT TRUNC()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

Và việc gọi nó với quá nhiều đối số dẫn đến lỗi:

SELECT TRUNC(1, 2, 3)
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT TRUNC(1, 2, 3)
FROM DUAL
Error at Command Line : 1 Column : 20
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm MONTHS_BETWEEN () trong Oracle

  2. Tham chiếu một bảng trong lược đồ khác đang sử dụng tên lược đồ

  3. Truy vấn tên cột từ một bảng từ người dùng khác

  4. Trình tự phân vùng Oracle

  5. Thu thập hàng loạt vào và thực hiện ngay lập tức trong Oracle