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

Hàm ROUND (ngày) trong Oracle

Trong Oracle, ROUND(date) hàm trả về một ngày được làm tròn thành một đơn vị ngày cụ thể.

Theo mặc định, nó làm tròn ngày thành ngày gần nhất, nhưng bạn có thể cung cấp một đối số tùy chọn chỉ định một đơn vị thay thế để sử dụng.

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

Cú pháp

Cú pháp như sau:

ROUND(date [, fmt ])

date phải giải quyết đến một DATE giá trị và fmt là một mô hình định dạng tùy chọn chỉ định đơn vị làm tròn date đến. 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.

Ví dụ

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

SELECT 
    ROUND(TO_DATE('2030-12-31 12:30:45', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Kết quả:

01-JAN-31

Trong trường hợp này, phần thời gian đã qua giữa trưa và ngày được làm tròn thành ngày hôm sau (cũng xảy ra vào tháng và năm tiếp theo).

Nó được làm tròn thành ngày vì đó là đơn vị mặc định để làm tròn và chúng tôi không chỉ định rõ ràng một đơn vị khác.

Đây là những gì sẽ xảy ra khi tôi giảm phần thời gian xuống trước giữa trưa:

SELECT 
    ROUND(TO_DATE('2030-12-31 11:59:59', 'YYYY-MM-DD HH24:MI:SS'))
FROM DUAL;

Kết quả:

31-DEC-30

Lần này được làm tròn đến cùng ngày.

Lưu ý rằng định dạng ngày được trả về phụ thuộc vào giá trị của NLS_DATE_FORMAT của bạn (đây là cách định dạng giá trị ngày cho phiên của bạn nếu bạn quan tâm).

Làm tròn đến một đơn vị ngày được chỉ định

Dưới đây là một ví dụ về việc chỉ định một đơn vị ngày khác để làm tròn ngày thành:

SELECT 
    ROUND(DATE '2030-12-31', 'MONTH')
FROM DUAL;

Kết quả:

01-JAN-31

Đây là một lần nữa, nhưng với nhiều ngày khác:

SELECT 
    ROUND(DATE '2030-03-10', 'MONTH') AS "2030-03-10",
    ROUND(DATE '2030-03-18', 'MONTH') AS "2030-03-18",
    ROUND(DATE '2030-08-10', 'MONTH') AS "2030-08-10",
    ROUND(DATE '2030-08-10', 'MONTH') AS "2030-08-10"
FROM DUAL;

Kết quả:

   2030-03-10    2030-03-18    2030-08-10    2030-08-10 
_____________ _____________ _____________ _____________ 
01-MAR-30     01-APR-30     01-AUG-30     01-AUG-30    

Và đây là với cùng một ngày, nhưng các yếu tố định dạng khác nhau:

SELECT 
    ROUND(DATE '2030-10-31', 'DAY') AS "Day",
    ROUND(DATE '2030-10-31', 'WW') AS "Week of year",
    ROUND(DATE '2030-10-31', 'MONTH') AS "Month",
    ROUND(DATE '2030-10-31', 'YEAR') AS "Year"
FROM DUAL;

Kết quả:

         Day    Week of year        Month         Year 
____________ _______________ ____________ ____________ 
03-NOV-30    29-OCT-30       01-NOV-30    01-JAN-31    

Điều này cho thấy chúng ta có thể có bao nhiêu biến thể, tùy thuộc vào đơn vị ngày được chỉ định.

Ngày phủ định

Dưới đây là những gì sẽ xảy ra khi chúng tôi chuyển chúng thành ngày phủ định:

SELECT 
    ROUND(DATE '-2030-10-31', 'DAY') AS "Day",
    ROUND(DATE '-2030-10-31', 'WW') AS "Week of year",
    ROUND(DATE '-2030-10-31', 'MONTH') AS "Month",
    ROUND(DATE '-2030-10-31', 'YEAR') AS "Year"
FROM DUAL;

Kết quả:

         Day    Week of year        Month         Year 
____________ _______________ ____________ ____________ 
28-OCT-30    29-OCT-30       01-NOV-30    01-JAN-29    

Rõ ràng, kết quả sẽ thay đổi khi ngày thay đổi.

Làm tròn các đối số không theo ngày

Đây là những gì sẽ xảy ra khi chúng tôi cố gắng làm tròn một đối số không phải ngày tháng mà không thể chuyển đổi thành DATE kiểu dữ liệu:

SELECT ROUND('Bruce')
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT ROUND('Bruce')
FROM DUAL
Error report -
ORA-01722: invalid number

Tuy nhiên, chúng ta có thể làm tròn số - có một phiên bản số của hàm này cho phép chúng ta làm tròn số.

Giá trị rỗng

Đang cố gắng làm tròn null trả về null và cố gắng làm tròn một ngày bằng null cũng dẫn đến null :

SET NULL 'null';

SELECT 
    ROUND(null),
    ROUND(null, 'MONTH'),    
    ROUND(DATE '2030-12-20', null)
FROM DUAL;

Kết quả:

   ROUND(NULL)    ROUND(NULL,'MONTH')    ROUND(DATE'2030-12-20',NULL) 
______________ ______________________ _______________________________ 
          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 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 chính xác

Đang gọi ROUND() mà không chuyển bất kỳ đối số nào sẽ trả về lỗi:

SELECT ROUND()
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT ROUND()
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 chuyển sai số đối số dẫn đến lỗi:

SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL;

Kết quả:

Error starting at line : 1 in command -
SELECT ROUND(DATE '2030-12-20', 'day', 'month')
FROM DUAL
Error at Command Line : 1 Column : 40
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. Chạy SCRIPT từ PL / SQL Block

  2. 4 Ví dụ về khối ẩn danh PL / SQL

  3. Chọn hàng thứ hai của bảng bằng rownum

  4. Lỗi ORA 00904:Số nhận dạng không hợp lệ

  5. Danh sách các tham số NLS trong Cơ sở dữ liệu Oracle