Konsekwencje zmiany NLS_TIMESTAMP_FORMAT


4

Administruję bazą danych 9.2.0.8, w której NLS_TIMESTAMP_FORMAT jest ustawione na 'DD-MON-RR HH.MI.SSXFF AM'; .

Prowadzi to do dziwnych wyników podczas korzystania z funkcji CAST TO TIMESTAMP :

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

Jeśli NLS_TIMESTAMP_FORMAT na 'DD-MON-YYYY HH.MI.SSXFF AM' to dobrze jest iść.

Czy zmiana parametru NLS_TIMESTAMP_FORMAT w bazie danych na YYYY ma jakieś konsekwencje?

4

Poziom bazy danychNLS_DATE_FORMATiNLS_TIMESTAMP_FORMATparametry nie są szczególnie przydatne, ponieważ są zawsze zastępowane przez ustawienia klienta.Więc nawet jeśli zmienisz ustawienia bazy danych, w 99% przypadków, gdy użytkownik przyjdzie i połączy się z bazą danych, ich sesja ustawiNLS_DATE_FORMATiNLS_TIMESTAMP_FORMATna podstawie klientaNLS_LANGlub inne ustawienia języka narodowego (np. aplikacje używające cienkiego sterownika JDBC używają ustawień internacjonalizacji JVM zamiast polegać na kliencieNLS_LANG) i unieważnij ustawienie wprowadzone w bazie danych.Istnieje kilka przypadków narożnych dotyczących korzystania z zadań bazy danychDBMS_JOBSlubDBMS_SCHEDULERgdzie nie ma klienta, w którym baza danychNLS_DATE_FORMATiNLS_TIMESTAMP_FORMATuważam, że są używane, ale są one raczej rzadkie.

Możesz utworzyć wyzwalacz logowania, który wykonałALTER SESSIONustawićNLS_DATE_FORMATiNLS_TIMESTAMP_FORMATna twoje sesje.To unieważniłoby ustawienia żądane przez klienta podczas tworzenia sesji.Jak zauważa Nick, musiałbyś się martwić, że inne zapytania polegają na bieżącym ustawieniu niejawnych konwersji, a twoja zmiana może złamać ten kod.

Ogólnie rzecz biorąc, lepiej jest unikać niejawnych konwersji, gdy tylko jest to możliwe, ale szczególnie, jeśli chodzi o konwersję ciągów znaków na daty lub znaczniki czasu i po prostu dlatego, że istnieje wiele różnych formatów, w których konfigurujesz problemy.Jeśli chcesz określić literał daty w swoim kodzie, znacznie lepiej używasz składni daty i datownika 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

Jeśli chcesz przekonwertować ciąg znaków na datę lub znacznik czasu, lepiej jest użyć aTO_DATElub aTO_TIMESTAMPz wyraźną maską formatu.


0

Istniejące zapytania oparte na tym formacie mogą zwracać różne wyniki.

Sprawdź, czy Twój istniejący kod interpretuje TIMESTAMP pól w sposób zależny od formatu i upewnij się, że zaktualizował go, jeśli tak.Należy również pamiętać, że NLS_TIMESTAMP_FORMAT można ustawić na poziomie bazy danych lub klienta, więc zwróć uwagę na format, który klient widzi, gdy wykonuje kod.