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

Oracle ngày giữa truy vấn

Đánh giá từ kết quả đầu ra của bạn, có vẻ như bạn đã xác định START_DATE làm dấu thời gian. Nếu đó là một ngày bình thường thì Oracle sẽ có thể xử lý việc chuyển đổi ngầm định. Nhưng vì nó không phải là bạn cần phải truyền các chuỗi đó thành ngày tháng một cách rõ ràng.

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL>
SQL> select * from t23
  2  where start_date between '15-JAN-10' and '17-JAN-10'
  3  /

no rows selected

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
  3  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000    

SQL> 

Nhưng chúng tôi vẫn chỉ nhận được một hàng. Điều này là do START_DATE có yếu tố thời gian. Nếu chúng ta không chỉ định thành phần thời gian thì Oracle sẽ mặc định nó là nửa đêm. Điều đó tốt cho từ mặt của BETWEEN nhưng không phải cho cho đến khi bên:

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') 
  3                       and to_date('17-JAN-10 23:59:59')
  4  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000
Product 1                       17-JAN-10 04.31.32.000

SQL>

chỉnh sửa

Nếu bạn không thể vượt qua thành phần thời gian, có một số lựa chọn. Một là thay đổi mệnh đề WHERE để loại bỏ yếu tố thời gian khỏi tiêu chí:

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

Điều này có thể có tác động đến hiệu suất, vì nó loại bỏ bất kỳ chỉ mục b-tree nào vào START_DATE. Thay vào đó, bạn sẽ cần phải xây dựng một chỉ mục dựa trên chức năng.

Ngoài ra, bạn có thể thêm yếu tố thời gian vào ngày trong mã của mình:

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

Do những vấn đề này, nhiều người muốn tránh sử dụng between bằng cách kiểm tra các ranh giới ngày như sau:

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để lưu trữ các ký tự không giới hạn trong Oracle 11g?

  2. Làm thế nào để xuất kết quả của câu lệnh SELECT được thực thi bằng SQL động nguyên gốc?

  3. Tại sao Oracle hiển thị ??? cho các ký tự đặc biệt như åäö

  4. Lấy tên của thủ tục hoặc hàm gọi trong Oracle PL / SQL

  5. Không phải là tháng hợp lệ trên một câu lệnh INSERT