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

TO_DATE của tôi dường như không hoạt động bình thường

Hầu hết có thể vấn đề là có một thành phần ngày phân số mà bạn không tính đến. Bạn có thể bỏ qua thành phần ngày phân số đó bằng cách cắt bớt cột trong truy vấn của mình:

SELECT section_id, COUNT(student_id) "ENROLLED"
FROM enrollment
WHERE TRUNC(enroll_date) = TO_DATE('2/10/2007', 'MM/DD/YYYY')
GROUP BY section_id
ORDER BY ENROLLED;

Tôi giả định rằng cột enroll_date thuộc loại dữ liệu DATE.

Một số giải thích:Oracle lưu trữ các ngày như được mô tả tại đây , nó KHÔNG lưu trữ ngày như bạn nêu "Định dạng ngày của nó đã là DD-MON-YY.". Đó chỉ là định dạng bạn thấy ngày, được xác định bởi tham số NLS_DATE_FORMAT cho phiên của bạn.

Hãy làm một bài kiểm tra nhanh với một bảng kiểm tra. Tạo bảng và kiểm tra biểu mẫu NLS_DATE_FORMAT phiên của tôi.

create table DATE_TST 
( id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  test_date DATE
);

INSERT INTO date_tst (test_date) VALUES (SYSDATE);

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT';

DD-MON-YYYY

Đây là cách tôi xem ngày tháng của mình.


SELECT * FROM date_tst;

04-OCT-2020

Vì vậy, tôi phải hẹn hò ngày nay. Mát mẻ. Bây giờ, hãy xem liệu tôi có thể truy vấn bằng ngày đó không:


SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020','DD-MON-YYYY');

no rows.

Không có hàng nào được hiển thị vì định dạng ngày mà tôi lấy ngày của mình không có thành phần thời gian. DATE có Năm, tháng, ngày, giờ, phút và giây. Định dạng chỉ có năm, tháng và ngày. Hãy truy vấn dữ liệu để kiểm tra xem có thành phần thời gian không.

SELECT TO_CHAR(test_date,'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

4-OCT-2020 21:12:39

À đây rồi ... SYSDATE là thời gian hiện tại tính đến giây. Bây giờ, hãy thử lại truy vấn đó với định dạng ngày chính xác hơn:

SELECT * FROM date_tst WHERE test_date = TO_DATE('04-OCT-2020 21:12:39','DD-MON-YYYY HH24:MI:SS');

04-OCT-2020

Và có hàng của chúng tôi. Lệnh TRUNC sẽ cắt thành phần thời gian:

SELECT TO_CHAR(TRUNC(test_date),'DD-MON-YYYY HH24:MI:SS') FROM date_tst;

04-OCT-2020 00:00:00

Vì vậy, bạn có thể đơn giản hóa truy vấn của mình:

SELECT * FROM date_tst WHERE TRUNC(test_date) = TO_DATE('04-OCT-2020','DD-MON-YYYY');

04-OCT-2020


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PhpStorm không thể phân giải cột cho nhiều kết nối cơ sở dữ liệu

  2. Entity Framework tạo short thay vì int

  3. Cách định cấu hình Máy chủ WebLogic cho Eclipse hiện có

  4. Hàm CHR () trong Oracle

  5. Sử dụng truy vấn SQL để xác định xem một bảng có tồn tại hay không