2012-11-27 32 views
10

Tôi có một cột chuỗi COL1 khi tôi đang làm điều nàyOracle ngày để chuyển đổi chuỗi

SELECT TO_CHAR(TO_DATE(COL1,'dd-mon-yy'), 'mm/dd/yyyy') 
FROM TABLE1 

Dữ liệu trong COL1 là trong dd-mon-yy, ví dụ như: 27-11-89 và 89 là năm 1989 nhưng lựa chọn trả về nó là 11/27/2089.

tôi phải làm một TO_DATE bên trong bởi vì nếu tôi không làm thì tôi nhận được một lỗi số không hợp lệ (ORA-01.722: số không hợp lệ)

Làm thế nào có thể hiển thị 1989 thay vì năm 2089? Xin vui lòng giúp

Trả lời

25

Dữ liệu trong COL1 là trong dd-mon-yy

Không nó không phải. Cột DATE không không có bất kỳ định dạng nào. Nó chỉ được chuyển đổi (ngầm) thành biểu diễn đó bởi trình khách SQL của bạn khi bạn hiển thị nó.

Nếu COL1 thực sự là cột DATE sử dụng to_date() trên cột này là vô dụng vì to_date() chuyển đổi chuỗi thành DATE.

Bạn chỉ cần to_char(), không có gì khác:

SELECT TO_CHAR(col1, 'mm/dd/yyyy') 
FROM TABLE1 

gì sẽ xảy ra trong trường hợp của bạn là gọi to_date() chuyển đổi DATE thành một giá trị ký tự (áp dụng định dạng mặc định NLS) và sau đó chuyển đổi đó trở lại một buổi hẹn hò. Do chuyển đổi ngầm ẩn này, một số thông tin bị mất trên đường.


Sửa

Vì vậy, bạn đã mang đến sai lầm lớn để lưu trữ một NGÀY trong một cột nhân vật. Và đó là lý do tại sao bạn nhận được các vấn đề bây giờ.

Giải pháp tốt nhất (và trung thực: chỉ hợp lý) là chuyển đổi cột đó thành DATE. Sau đó, bạn có thể chuyển đổi các giá trị thành bất kỳ định nghĩa lại nào mà bạn muốn mà không phải lo lắng về việc chuyển đổi kiểu dữ liệu ngầm định.

Nhưng có lẽ hầu hết câu trả lời là "Tôi thừa hưởng mô hình này, tôi phải đối phó với nó" (nó luôn luôn là, dường như không ai chịu trách nhiệm về việc lựa chọn các kiểu dữ liệu sai), sau đó bạn cần phải sử dụng RR thay của YY:

SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy') 
FROM TABLE1 

nên thực hiện thủ thuật.Lưu ý rằng tôi cũng đã thay đổi mon-mm như ví dụ của bạn là 27-11-89 trong đó có một số trong tháng, không phải là một "từ" (như Tháng Mười Một)

Để biết thêm thông tin chi tiết xem hướng dẫn: http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215

+0

Xin lỗi, đó là cột chuỗi. Tôi đã chỉnh sửa câu hỏi của tôi về lý do tại sao tôi làm điều đó. – Ram

+1

@Ram: Không *** đặt ngày tháng vào các cột ký tự. Vấn đề bạn đang gặp phải hiện tại chỉ tồn tại vì bạn đã làm như vậy. –

+0

@Ram: xem chỉnh sửa của tôi để có giải pháp có thể –

0

Nếu bạn là loại DATE (như bạn nói), sau đó bạn không cần phải chuyển đổi nó thành chuỗi đầu tiên (trên thực tế, bạn sẽ chuyển nó thành chuỗi trước tiên, sau đó rõ ràng là một ngày và một cách rõ ràng thành chuỗi):

SELECT TO_CHAR(COL1, 'mm/dd/yyyy') FROM TABLE1 

Định dạng ngày mà bạn thấy cho cột của bạn là một tạo phẩm của công cụ bạn sử dụng (TOAD, SQL Developer, v.v.) và các cài đặt ngôn ngữ của nó.

+0

Xin lỗi, đó là cột chuỗi. Tôi đã chỉnh sửa câu hỏi của tôi về lý do tại sao tôi làm điều đó. – Ram

1

Hãy thử điều này. Oracle có tính năng này để phân biệt những năm thiên niên kỷ ..

Như bạn nói, nếu cột của bạn là một varchar, sau đó truy vấn dưới đây sẽ mang lại bạn 1989 ..

chọn to_date (column_name, 'dd/mm/rr ') từ bảng 1;

Khi định dạng rr được sử dụng trong năm, sau đây sẽ được thực hiện bởi oracle.

nếu rr-> 00-49 ---> Kết quả sẽ là 2000-2049, nếu rr-> 50-99 ---> Kết quả sẽ là 1950-1999

0

Một điều cần chú ý là bạn đang cố gắng chuyển đổi ngày trong tháng/ngày/năm nhưng nếu bạn có kế hoạch so sánh ngày được chuyển đổi này với một số ngày khác thì hãy đảm bảo chuyển đổi định dạng yyyy-mm-dd chỉ vì to_char chuyển đổi thành chuỗi và với bất kỳ định dạng nào khác, chúng tôi sẽ nhận được kết quả không mong muốn. Để được giải thích thêm, hãy thực hiện theo các bước sau: Comparing Dates in Oracle SQL

Các vấn đề liên quan