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àoNLS_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_LANGUAGE
và NLS_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
.