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

So sánh ngày trong Oracle SQL

31-DEC-95 không phải là một chuỗi, cũng không phải là 20-JUN-94 . Chúng là những con số với một số thứ bổ sung được thêm vào ở cuối. Đây phải là '31-DEC-95' hoặc '20-JUN-94' - lưu ý câu trích dẫn duy nhất, ' . Điều này sẽ cho phép bạn thực hiện so sánh chuỗi.

Tuy nhiên, bạn không thực hiện so sánh chuỗi; bạn đang thực hiện một so sánh ngày . Bạn nên chuyển đổi chuỗi của mình thành ngày tháng. Bằng cách sử dụng TO_DATE() tích hợp sẵn hàm, hoặc một ký tự ngày tháng.

TO_DATE ()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Phương pháp này có một số cạm bẫy không cần thiết

  • Như a_horse_with_no_name đã lưu ý trong các nhận xét, DEC , không nhất thiết có nghĩa là tháng mười hai. Nó phụ thuộc vào NLS_DATE_LANGUAGE của bạn và NLS_DATE_FORMAT cài đặt. Để đảm bảo so sánh của bạn với công việc ở bất kỳ ngôn ngữ nào, bạn có thể sử dụng mô hình định dạng ngày giờ MM thay vào đó
  • Năm '95 không chính xác. Bạn biết ý bạn là 1995, nhưng nếu đó là '50, đó là 1950 hay 2050? Tốt nhất là luôn luôn rõ ràng
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Ký tự ngày

Ký tự ngày tháng là một phần của tiêu chuẩn ANSI, có nghĩa là bạn không cần phải sử dụng một hàm cụ thể của Oracle. Khi sử dụng một nghĩa đen, bạn phải chỉ định ngày của bạn ở định dạng YYYY-MM-DD và bạn không thể bao gồm yếu tố thời gian.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

Hãy nhớ rằng kiểu dữ liệu ngày của Oracle bao gồm một phần thời gian, vì vậy ngày không có phần thời gian tương đương với 1995-12-31 00:00:00 .

Nếu bạn muốn bao gồm một phần thời gian thì bạn phải sử dụng ký tự dấu thời gian, có định dạng YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Thông tin khác

NLS_DATE_LANGUAGE có nguồn gốc từ NLS_LANGUAGENLS_DATE_FORMAT được bắt nguồn từ NLS_TERRITORY . Chúng được đặt khi bạn tạo cơ sở dữ liệu ban đầu nhưng chúng có thể được thay đổi bằng cách thay đổi tệp thông số inialization của bạn - chỉ khi thực sự cần thiết - hoặc ở cấp phiên bằng cách sử dụng ALTER SESSION cú pháp. Ví dụ:

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Điều này có nghĩa là:

  • DD ngày số trong tháng, 1 - 31
  • MM tháng số trong năm, 01 - 12 (tháng 1 là 01)
  • YYYY Năm 4 chữ số - theo tôi đây là luôn luôn tốt hơn năm 2 chữ số YY vì không có sự nhầm lẫn với thế kỷ bạn đang đề cập đến.
  • HH24 giờ trong ngày, 0 - 23
  • MI phút trong giờ, 0 - 59
  • SS giây của phút, 0-59

Bạn có thể tìm cài đặt ngôn ngữ ngày và ngôn ngữ hiện tại của mình bằng cách truy vấn V$NLS_PARAMETERSs và toàn bộ các giá trị hợp lệ bằng cách truy vấn V$NLS_VALID_VALUES .

Đọc thêm

  • Định dạng mô hình

Ngẫu nhiên, nếu bạn muốn count(*) bạn cần nhóm theo employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Điều này cung cấp cho bạn số lượng per employee_id .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách bật chế độ nhật ký lưu trữ trong cơ sở dữ liệu Oracle 19c

  2. Làm cách nào để xem kế hoạch thực thi SQL trong Oracle?

  3. Oracle SQL Developer:Hiển thị kết quả REFCURSOR trong Grid?

  4. Cách lặp qua phạm vi ngày trong PL / SQL

  5. Tính tuổi từ ngày sinh với trình kích hoạt oracle plsql và chèn tuổi vào bảng