Bạn không chèn dấu thời gian ở một định dạng cụ thể. Dấu thời gian (và ngày tháng) được lưu trữ trong cơ sở dữ liệu bằng cách sử dụng một đại diện bên trong, có độ chính xác là 7 và 11 byte tùy thuộc vào loại và độ chính xác. Có thêm thông tin về điều đó trong câu hỏi này , trong số những người khác.
Khách hàng hoặc ứng dụng của bạn quyết định cách hiển thị giá trị ở dạng chuỗi mà con người có thể đọc được.
Khi bạn làm:
to_timestamp(localtimestamp,'YYYY/MM/DD')
bạn đang chuyển đổi ngầm localtimestamp
thành một chuỗi, sử dụng cài đặt NLS trong phiên của bạn, sau đó chuyển đổi nó trở lại dấu thời gian. Điều đó có thể ngẫu nhiên thay đổi giá trị - làm mất độ chính xác - nhưng sẽ không thay đổi cách giá trị được lưu trữ bên trong. Trong trường hợp của bạn, sự không khớp giữa cài đặt NLS và định dạng bạn đang cung cấp dẫn đến lỗi ORA-01830.
Vì vậy, lần chèn đầu tiên của bạn là chính xác (giả sử bạn thực sự muốn thời gian phiên, không phải thời gian máy chủ). Nếu bạn muốn xem các giá trị được lưu trữ theo một định dạng cụ thể sau đó thay đổi cài đặt NLS của phiên khách hàng của bạn hoặc tốt hơn là định dạng nó một cách rõ ràng khi bạn truy vấn nó, ví dụ:
select to_char(time, 'YYYY-MM-DD HH24:MI:SS.FF3') from activity_log