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ố có thêm một số thứ được thêm vào cuối. Điều này nên '31-DEC-95'
hoặc '20-JUN-94'
- lưu ý trích dẫn duy nhất , '
. Điều này sẽ cho phép bạn thực hiện một so sánh chuỗi.
Tuy nhiên, bạn không thực hiện so sánh chuỗi; bạn đang làm một so sánh ngày . Bạn nên chuyển đổi chuỗi của bạn thành một ngày. Hoặc bằng cách sử dụng TO_DATE()
chức năng tích hợp, hoặc một ngày theo nghĩa đen .
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 vài cạm bẫy không cần thiết
- Như a_horse_with_no_name đã ghi chú trong các bình luận,
DEC
không nhất thiết có nghĩa là tháng 12. Nó phụ thuộc vào NLS_DATE_LANGUAGE
và NLS_DATE_FORMAT
cài đặt của bạn . Để đảm bảo rằng so sánh của bạn với công việc ở bất kỳ miền địa phương nào, bạn có thể sử dụng mô hình định dạng datetime MM
thay thế
- Năm '95 không chính xác. Bạn biết bạn có nghĩa là năm 1995, nhưng nếu đó là '50, thì đó là năm 1950 hay 2050? Luôn luôn tốt nhất để được rõ ràng
select employee_id
from employee
where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
Ngày tháng chữ
Một chữ theo ngày là một phần của tiêu chuẩn ANSI, có nghĩa là bạn không phải sử dụng một chức năng cụ thể của Oracle. Khi sử dụng nghĩa đen, bạn phải chỉ định ngày của mình ở đị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 việc sắp xếp 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 một dấu thời gian bằng chữ, 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êm thông tin
NLS_DATE_LANGUAGE
có nguồn gốc từ NLS_LANGUAGE
và NLS_DATE_FORMAT
có nguồn gốc từ NLS_TERRITORY
. Chúng được đặt khi ban đầu bạn tạo cơ sở dữ liệu nhưng chúng có thể được thay đổi bằng cách thay đổi tệp tham 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, điều này 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ỷ mà bạn đang đề cập đến.
HH24
giờ trong ngày, 0 - 23
MI
phút của giờ, 0 - 59
SS
giây thứ hai, 0-59
Bạn có thể tìm ra ngôn ngữ hiện tại và cài đặt ngôn ngữ ngày bằng cách truy vấn V$NLS_PARAMETERSs
và toàn bộ gam giá trị hợp lệ bằng cách truy vấn V$NLS_VALID_VALUES
.
đọc thêm
Ngẫu nhiên, nếu bạn muốn nhóm count(*)
bạn cần nhómemployee_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 mỗi employee_id
.
> <
hoặcBETWEEN '' AND ''