Helpex - Trao đổi & giúp đỡ Đăng nhập
157

Tôi đang cố gắng để nó hiển thị số lượng nhân viên được thuê sau ngày 20 tháng 6 năm 1994,

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 

Nhưng tôi gặp lỗi khi nói

"JUN 'định danh không hợp lệ.

Xin vui lòng giúp đỡ, cảm ơn!

157 hữu ích 1 bình luận 710k xem chia sẻ
320

31-DEC-95khô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. Điều này nên '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 so sánh ngày tháng . 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 hàm tích hợp sẵn TO_DATE()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, DECkhông nhất thiết có nghĩa là tháng 12. Nó phụ thuộc vào bạn NLS_DATE_LANGUAGENLS_DATE_FORMATcài đặt. Để đảm bảo rằng 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 thế
  • Năm '95 là 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')

Ngày tháng

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 ký tự, bạn phải chỉ định ngày của mình theo định dạng YYYY-MM-DDvà 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êm thông tin

NLS_DATE_LANGUAGEcó nguồn gốc từ NLS_LANGUAGENLS_DATE_FORMATcó nguồn gốc 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 yêu cầu - hoặc ở cấp phiên bằng cách sử dụng ALTER SESSIONcú 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 Giêng là 01)
  • YYYYNăm 4 chữ số - theo ý kiến ​​của tôi, điều này luôn tốt hơn năm 2 chữ số YYvì 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 của phút, 0-59

Bạn có thể tìm ra 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_PARAMETERSsvà toàn bộ các 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 count(*)bạn cần phải nhóm theoemployee_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 .

320 hữu ích 5 bình luận chia sẻ
6

Phần kết luận,

to_char hoạt động theo cách riêng của nó

Vì thế,

Luôn sử dụng định dạng YYYY-MM-DD này để so sánh thay vì MM-DD-YY hoặc DD-MM-YYYY hoặc bất kỳ định dạng nào khác

6 hữu ích 0 bình luận chia sẻ
4

Bạn có thể sử dụng trunc và to_date như sau:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;
4 hữu ích 0 bình luận chia sẻ
4

từ truy vấn của bạn:

Select employee_id, count(*) From Employee 
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 

tôi nghĩ rằng nó không hiển thị số lượng nhân viên được thuê sau ngày 20 tháng 6 năm 1994. nếu bạn muốn hiển thị số lượng nhân viên, bạn có thể sử dụng:

Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

Tôi nghĩ rằng phương pháp hay nhất để so sánh các ngày bạn có thể sử dụng:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
4 hữu ích 0 bình luận chia sẻ
-4

Phải có một dấu ngoặc kép, kể từ ngày được chuyển đổi thành ký tự.

Chọn nhân_viên, đếm (*)
Từ nhân viên
Where to_char (worker_date_hired, 'DD-MON-YY')> '31 -DEC-95 ';
-4 hữu ích 3 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ sql oracle date-comparison , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading