NLS_TIMESTAMP_FORMAT 변경의 결과


4

나는 9.2.0.8 데이터베이스 관리 NLS_TIMESTAMP_FORMAT 설정되어 'DD-MON-RR HH.MI.SSXFF AM'; .

CAST TO TIMESTAMP 함수를 사용할 때 이상한 결과가 발생합니다.

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

NLS_TIMESTAMP_FORMAT'DD-MON-YYYY HH.MI.SSXFF AM' 변경하면 나도 좋습니다.

변화하는 것 NLS_TIMESTAMP_FORMAT 에 데이터베이스에 매개 변수를 YYYY 어떤 결과가?

4

데이터베이스 수준NLS_DATE_FORMATNLS_TIMESTAMP_FORMAT매개 변수는 항상 클라이언트 설정에 의해 무시되기 때문에 특히 유용하지 않습니다.따라서 데이터베이스 설정을 변경하더라도 사용자가 방문하여 데이터베이스에 연결하는 시간의 99 % 이상을 세션에서 설정하면NLS_DATE_FORMATNLS_TIMESTAMP_FORMAT고객의NLS_LANG또는 다른 자국어 설정 (즉, thin JDBC 드라이버를 사용하는 응용 프로그램은 클라이언트에 의존하기보다는 JVM의 국제화 설정을 사용합니다NLS_LANG) 데이터베이스에서 만든 설정을 덮어 씁니다.데이터베이스 작업과 관련된 몇 가지 문제가 있습니다.DBMS_JOBS또는DBMS_SCHEDULER데이터베이스가있는 클라이언트가없는 곳NLS_DATE_FORMATNLS_TIMESTAMP_FORMAT나는 믿는다. 그러나 그것들은 약간 드물다.

로그인 트리거를 만들 수 있습니다.ALTER SESSION설정NLS_DATE_FORMATNLS_TIMESTAMP_FORMAT귀하의 세션.그러면 클라이언트가 세션을 만들 때 요청한 설정이 무효화됩니다.Nick이 지적했듯이 다른 쿼리가 암시 적 변환에 대한 현재 설정에 의존하고 변경으로 인해 코드가 손상 될 수 있다는 점에 대해 걱정해야합니다.

일반적으로 가능한 한 어디서나 암시 적 변환을 피하는 것이 훨씬 더 낫습니다. 특히 문자열을 날짜와 타임 스탬프간에 변환하는 것은 단순히 여러 가지 형식으로 인해 문제가 발생하기 때문입니다.코드에서 날짜 리터럴을 지정하려면 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

문자열을 날짜 또는 타임 스탬프로 변환하려면TO_DATE또는TO_TIMESTAMP명시적인 형식 마스크로.


0

이 형식을 사용하는 기존 쿼리는 다른 결과를 반환 할 수 있습니다.

기존 코드가 형식에 따라 TIMESTAMP 필드를 해석하는지 확인하십시오. 형식이 맞는 경우 업데이트하십시오.데이터베이스 또는 클라이언트 수준에서 NLS_TIMESTAMP_FORMAT 을 설정할 수 있으므로 클라이언트가 코드를 실행할 때 어떤 형식으로 표시되는지 유의하십시오.