Dữ liệu trong COL1 ở dạng dd-mon-yy
Không, không phải đâu. DATE
cột không không có bất kỳ định dạng nào. Nó chỉ được máy khách SQL của bạn chuyển đổi (ngầm hiểu) thành biểu diễn đó khi bạn hiển thị nó.
Nếu COL1 thực sự là DATE
cột sử dụng to_date()
trên đó là vô ích vì to_date()
chuyển đổi một chuỗi thành DATE.
Bạn chỉ cần to_char (), không cần gì khác:
SELECT TO_CHAR(col1, 'mm/dd/yyyy')
FROM TABLE1
Điều gì 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 NLS mặc định) và sau đó chuyển đổi giá trị đó trở lại DATE. Do chuyển đổi ngầm kép này, một số thông tin sẽ bị mất trên đường đi.
Chỉnh sửa
Vì vậy, bạn đã mắc phải sai lầm lớn đó khi lưu trữ NGÀY trong cột ký tự. Và đó là lý do tại sao bạn gặp phải vấn đề bây giờ.
Giải pháp tốt nhất (và thành thật mà nói: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ỳ bản trình bày 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 đương đầu với nó "(luôn luôn là như vậy, dường như không ai chịu trách nhiệm về việc chọn sai kiểu dữ liệu), khi đó bạn cần sử dụng RR
thay vì YY
:
SELECT TO_CHAR(TO_DATE(COL1,'dd-mm-rr'), 'mm/dd/yyyy')
FROM TABLE1
nên làm thủ thuật. Lưu ý rằng tôi cũng đã thay đổi mon
thành mm
như ví dụ của bạn là 27-11-89
có một số cho tháng, không phải một "từ" (như NOV )
Để biết thêm chi tiết, hãy xem hướng dẫn:http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215