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)
và 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: