Nguyên nhân gốc rễ:
Bạn đang chuyển đổi một NUMBER tới STRING , giả sử đó là DATE . 20111010
không phải là NGÀY, mà là SỐ. Ngoài ra, '20111010'
không phải là DATE, mà là STRING. Chúng hoàn toàn khác nhau.
-
20111010
- NUMBER -
'20111010'
- STRING -
TO_DATE('20111010','YYYYMMDD')
- NGÀY
Lỗi:
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
Đến với truy vấn của bạn:
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
Bạn đang làm phức tạp việc chuyển đổi và định dạng một cách không cần thiết.
TIMESTAMP loại dữ liệu là một phần mở rộng vào DATE loại dữ liệu. Ngoài các phần tử ngày giờ của kiểu dữ liệu DATE, kiểu dữ liệu TIMESTAMP chứa các phần tử của giây với độ chính xác từ 0 đến 9 chữ số thập phân, giá trị mặc định là 6.
Vì bạn đang xử lý TIMESTAMP bạn có thể sử dụng TO_TIMESTAMP .
Trong khi thực hiện số học DATE / TIMESTAMP , bạn nên để nguyên kiểu dữ liệu và không chuyển đổi nó thành chuỗi . Bạn cần sử dụng TO_CHAR chỉ dành cho hiển thị .
Sửa đổi vị từ bộ lọc của bạn thành:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Ở trên, :fromDate
và :toDate
phải là một chuỗi và không phải là số .
Ví dụ:
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Hoặc, sử dụng TO_CHAR trước tiên chuyển đổi số thành chuỗi :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM