Hậu quả của việc thay đổi NLS_TIMESTAMP_FORMAT


4

Tôi quản trị cơ sở dữ liệu 9.2.0.8 trong đó NLS_TIMESTAMP_FORMAT được đặt thành 'DD-MON-RR HH.MI.SSXFF AM'; .

Điều này dẫn đến kết quả kỳ lạ khi sử dụng chức năng CAST TO TIMESTAMP :

select CAST('14-SEP-2011' AS TIMESTAMP) "DATE" from dual;
----------
14-SEP-2020 11:00:00.000000 AM 

Nếu tôi thay đổi NLS_TIMESTAMP_FORMAT thành 'DD-MON-YYYY HH.MI.SSXFF AM' thì tôi tốt để đi.

Việc thay đổi tham số NLS_TIMESTAMP_FORMAT trên cơ sở dữ liệu thành YYYY có hậu quả gì không?

4

Cấp cơ sở dữ liệuNLS_DATE_FORMATNLS_TIMESTAMP_FORMATcác tham số không đặc biệt hữu ích vì chúng luôn bị ghi đè bởi cài đặt máy khách.Vì vậy, ngay cả khi bạn thay đổi cài đặt cơ sở dữ liệu, 99% thời gian khi người dùng xuất hiện và kết nối với cơ sở dữ liệu, phiên của họ sẽ đặtNLS_DATE_FORMATNLS_TIMESTAMP_FORMATdựa trên khách hàngNLS_LANGhoặc các cài đặt ngôn ngữ quốc gia khác (ví dụ: các ứng dụng sử dụng trình điều khiển JDBC mỏng sử dụng các cài đặt quốc tế hóa của JVM thay vì dựa vào máy kháchNLS_LANG) và ghi đè cài đặt bạn đã thực hiện trong cơ sở dữ liệu.Có một vài trường hợp góc liên quan đến công việc cơ sở dữ liệu bằng cách sử dụngDBMS_JOBShoặc làDBMS_SCHEDULERnơi không có khách hàng nơi cơ sở dữ liệuNLS_DATE_FORMATNLS_TIMESTAMP_FORMATđược sử dụng, tôi tin, nhưng chúng khá hiếm.

Bạn có thể tạo một kích hoạt đăng nhập đã làm mộtALTER SESSIONđể đặtNLS_DATE_FORMATNLS_TIMESTAMP_FORMATcho các phiên của bạn.Điều đó sẽ ghi đè cài đặt mà khách hàng yêu cầu khi tạo phiên.Như Nick chỉ ra, bạn phải lo lắng rằng các truy vấn khác đang dựa vào cài đặt hiện tại cho các chuyển đổi ngầm định và thay đổi của bạn có thể phá vỡ mã đó.

Nói chung, tốt hơn hết là bạn nên tránh chuyển đổi ngầm bất cứ khi nào có thể, nhưng đặc biệt là khi chuyển đổi chuỗi sang hoặc từ ngày và dấu thời gian chỉ đơn giản vì có rất nhiều định dạng khác nhau mà bạn tự đặt ra vấn đề.Nếu bạn muốn chỉ định một ngày theo nghĩa đen trong mã của mình, bạn sẽ tốt hơn nhiều khi sử dụng cú pháp dấu thời gian và ngày của ANSI

SQL> ed
Wrote file afiedt.buf

    1 select cast( date '2011-09-14' as timestamp ) dt,
    2     timestamp '2011-09-14 13:15:30' ts
    3*  from dual
SQL> /

DT               TS
------------------------------ -----------------------------------
14-SEP-11 12.00.00.000000 AM  14-SEP-11 01.15.30.000000000 PM

Nếu bạn muốn chuyển đổi một chuỗi thành một ngày hoặc dấu thời gian, tốt hơn hết bạn nên sử dụng mộtTO_DATEhoặc một638157984150630370656666với một mặt nạ định dạng rõ ràng.


0

Các truy vấn hiện có dựa trên định dạng này có thể trả về các kết quả khác nhau.

Kiểm tra xem mã hiện tại của bạn có diễn giải các trường TIMESTAMP theo cách phụ thuộc vào định dạng hay không và đảm bảo cập nhật mã nếu có.Cũng lưu ý rằng NLS_TIMESTAMP_FORMAT có thể được đặt ở cấp độ cơ sở dữ liệu hoặc máy khách, vì vậy hãy lưu ý định dạng mà khách hàng nhìn thấy khi thực thi mã.