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

Tôi gặp sự cố khi cố gắng chọn dữ liệu từ bảng lọc theo ngày.

Ví dụ:

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = '23/04/49';

Lỗi Oracle là:

Informe de error:
Error SQL: ORA-01843: mes no válido
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

Có thể dữ liệu nguồn của bảng bị hỏng, trong trường hợp này:

  • Làm thế nào tôi có thể giải quyết vấn đề này?
  • Tôi có thể thay đổi ngày này cho null không?

Kết quả của lựa chọn này select * from nls_session_parameters;, là:

PARAMETER                      VALUE                                  
------------------------------ ----------------------------------------
NLS_LANGUAGE                   SPANISH                                  
NLS_TERRITORY                  SPAIN                                    
NLS_CURRENCY                   ¿                                        
NLS_ISO_CURRENCY               SPAIN                                    
NLS_NUMERIC_CHARACTERS         ,.                                       
NLS_CALENDAR                   GREGORIAN                                
NLS_DATE_FORMAT                DD/MM/RR                                 
NLS_DATE_LANGUAGE              SPANISH                                  
NLS_SORT                       SPANISH                                  
NLS_TIME_FORMAT                HH24:MI:SSXFF                            
NLS_TIMESTAMP_FORMAT           DD/MM/RR HH24:MI:SSXFF                   
NLS_TIME_TZ_FORMAT             HH24:MI:SSXFF TZR                        
NLS_TIMESTAMP_TZ_FORMAT        DD/MM/RR HH24:MI:SSXFF TZR               
NLS_DUAL_CURRENCY              ¿                                        
NLS_COMP                       BINARY                                   
NLS_LENGTH_SEMANTICS           BYTE                                     
NLS_NCHAR_CONV_EXCP            FALSE 
32 hữu ích 2 bình luận 344k xem chia sẻ
11 trả lời 11
43

Bạn nên sử dụng to_datehàm ( oracle / functions / to_date.php )

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = TO_DATE('23/04/49', 'DD/MM/YY');
43 hữu ích 5 bình luận chia sẻ
10

Bạn đang so sánh một cột ngày tháng với một chuỗi ký tự. Trong trường hợp như vậy, Oracle cố gắng chuyển đổi chữ của bạn thành một ngày, sử dụng định dạng ngày mặc định. Việc dựa vào hành vi như vậy là một thực tiễn không tốt, vì mặc định này có thể thay đổi nếu DBA thay đổi một số cấu hình, Oracle phá vỡ điều gì đó trong bản sửa đổi trong tương lai, v.v.

Thay vào đó, bạn nên luôn chuyển đổi nghĩa đen của mình thành ngày tháng một cách rõ ràng và nêu định dạng bạn đang sử dụng:

SELECT * FROM MYTABLE WHERE MYTABLE.DATEIN = TO_DATE('23/04/49','MM/DD/YY');
10 hữu ích 1 bình luận chia sẻ
7

Nếu bạn không cần kiểm tra dấu thời gian chính xác, hãy sử dụng

SELECT * FROM MYTABLE WHERE trunc(DATEIN) = TO_DATE('23-04-49','DD-MM-YY');

nếu không, bạn có thể sử dụng

SELECT * FROM MYTABLE WHERE DATEIN = TO_DATE('23-04-49 20:18:07','DD-MM-YY HH24:MI:SS');

Ở đây, bạn sử dụng mã cứng ngày, nếu bạn so sánh trực tiếp thì bạn phải sử dụng DD-MM-YY HH24: MI: SS nếu không bạn có thể nhận được ORA-01849: giờ phải từ 1 đến 12.

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

Tôi biết điều này là hơi muộn, nhưng tôi đang gặp vấn đề tương tự. SQL*Plusthực hiện truy vấn thành công, nhưng Oracle SQL Developerhiển thịORA-01843: not a valid month error.

SQL*Plus dường như biết rằng ngày tôi đang sử dụng ở định dạng hợp lệ, trong khi Nhà phát triển SQL Oracle cần được thông báo rõ ràng về định dạng ngày tháng của tôi.

  • SQL*Plus statement:

    select count(*) from some_table where DATE_TIME_CREATED < '09-12-23';
    

VS

  • Oracle SQL Developer statement:

     select count(*) from some_table where DATE_TIME_CREATED < TO_DATE('09-12-23','RR-MM-DD');
    
4 hữu ích 0 bình luận chia sẻ
1

Chỉ trong trường hợp điều này có ích, tôi đã giải quyết vấn đề này bằng cách kiểm tra định dạng ngày của máy chủ:

SELECT * FROM nls_session_parameters WHERE parameter = 'NLS_DATE_FORMAT';

sau đó bằng cách sử dụng so sánh sau (trường bên trái là ngày + giờ):

AND EV_DTTM >= ('01-DEC-16')

Tôi đã thử điều này với TO_DATEnhưng vẫn gặp lỗi. Nhưng khi tôi so khớp chuỗi của mình với NLS_DATE_FORMATvà remove TO_DATE, nó hoạt động ...

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

Bộ phiên ALTER NLS_LANGUAGE = 'AMERICAN';

1 hữu ích 2 bình luận chia sẻ
0

Trong nhận xét cho một trong những câu trả lời mà bạn đề cập rằng ngày_năm với một định dạng không hữu ích. Trong một nhận xét khác, bạn giải thích rằng bảng được truy cập qua DBLINK.

Vì vậy, rõ ràng là hệ thống khác chứa một ngày không hợp lệ mà Oracle không thể chấp nhận. Sửa lỗi này trong các dbms khác (hoặc bất cứ thứ gì bạn liên kết đến) và truy vấn của bạn sẽ hoạt động.

Đã nói điều này, tôi đồng ý với những người khác: luôn sử dụng to_date với một định dạng để chuyển đổi một chuỗi ký tự thành một ngày. Cũng đừng bao giờ chỉ sử dụng hai chữ số trong một năm. Ví dụ: '23 / 04/49 'có nghĩa là 2049 trong hệ thống của bạn (định dạng RR), nhưng nó gây nhầm lẫn cho người đọc (như bạn thấy từ các câu trả lời đề xuất định dạng với YY).

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

Nếu ngày nguồn chứa phần phút và phần giây, so sánh ngày của bạn sẽ không thành công. bạn cần chuyển đổi ngày nguồn sang định dạng bắt buộc bằng cách sử dụng to_char và cả ngày đích.

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

Nếu bạn đang sử dụng các công cụ dòng lệnh, thì bạn cũng có thể đặt nó trong shell.

Trên linux, với một trình bao kiểu sh, bạn có thể làm như sau:

export NLS_TIMESTAMP_FORMAT='DD/MON/RR HH24:MI:SSXFF'

Sau đó, bạn có thể sử dụng các công cụ dòng lệnh và nó sẽ sử dụng định dạng được chỉ định:

/path/to/dbhome_1/bin/sqlldr user/pass@host:port/service control=table.ctl direct=true
0 hữu ích 0 bình luận chia sẻ
0

Hãy thử sử dụng:

SELECT *
FROM MYTABLE
WHERE MYTABLE.DATEIN is not null 
AND MYTABLE.DATEIN = '23/04/49';
0 hữu ích 0 bình luận chia sẻ
-1

Sử dụng monthdưới dạng một chuỗi.

Thí dụ:

(12-Apr-2002) or (12-April-2002)
-1 hữu ích 0 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 select , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading