NLS_TIMESTAMP_FORMAT değiştirmenin sonuçları


4

Bir 9.2.0.8 veri tabanı yönetiyorumNLS_TIMESTAMP_FORMATayarlandı'DD-MON-RR HH.MI.SSXFF AM';.

Kullanırken bu garip sonuçlara yol açarCAST TO TIMESTAMPfonksiyon:

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

Eğer değiştirirsemNLS_TIMESTAMP_FORMATiçin'DD-MON-YYYY HH.MI.SSXFF AM'o zaman gitmeye hazırım.

Değişiyor muNLS_TIMESTAMP_FORMATveritabanındaki parametreYYYYherhangi bir sonucu var mı?

4

Veri tabanı seviyesiNLS_DATE_FORMATveNLS_TIMESTAMP_FORMATParametreler özellikle kullanışlı değildir, çünkü her zaman istemci ayarları tarafından geçersiz kılınırlar.Dolayısıyla, veritabanı ayarını değiştirseniz bile, bir kullanıcının gelip veritabanına bağlandığı zamanın% 99 +%, oturum birNLS_DATE_FORMATveNLS_TIMESTAMP_FORMATmüşterinin dayalıNLS_LANGveya diğer ulusal dil ayarları (yani, ince JDBC sürücüsünü kullanan uygulamalar, müşteriye güvenmek yerine JVM'nin uluslararasılaşma ayarlarını kullanır.NLS_LANG) ve veritabanında yaptığınız ayarı geçersiz kılın.Kullanarak veritabanı işleri içeren birkaç köşe vaka vardırDBMS_JOBSveyaDBMS_SCHEDULERnerede veritabanı yoksa müşteri yokNLS_DATE_FORMATveNLS_TIMESTAMP_FORMATkullanılmış, inanıyorum ama bunlar oldukça nadir.

Bir giriş tetikleyici oluşturabilirsiniz.ALTER SESSIONayarlamak içinNLS_DATE_FORMATveNLS_TIMESTAMP_FORMAToturumlarınız için.Bu, müşterinin oturumu oluştururken istediği ayarları geçersiz kılar.Nick'in işaret ettiği gibi, diğer sorguların örtük dönüşümler için geçerli ayara bağlı olduğundan endişelenmeniz gerekir ve yaptığınız değişiklik bu kodu bozabilir.

Genel olarak, mümkün olan her yerde örtük dönüşümlerden kaçınmaktan çok daha iyidir, ancak özellikle de dizeleri tarihlere ve zaman damgalarına dönüştürmek söz konusu olduğunda, yalnızca sorunlara hazırladığınız çok farklı biçimler olduğundan.Kodunuzda bir hazır bilgi tarihi belirtmek istiyorsanız, ANSI tarihini ve zaman damgası sözdizimini kullanmanız çok daha iyi

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

Bir dizgiyi bir tarihe veya zaman damgasına dönüştürmek istiyorsanız,TO_DATEveya birTO_TIMESTAMPaçık bir biçimli maske ile.


0

Bu formata dayanan mevcut sorgular farklı sonuçlar verebilir.

Mevcut kodunuzun TIMESTAMP alanlarını biçime bağlı bir şekilde yorumlayıp yorumlamadığını kontrol edin ve varsa güncellediğinizden emin olun.Ayrıca NLS_TIMESTAMP_FORMAT veritabanında veya müşteri düzeyinde ayarlanabileceğini unutmayın; bu nedenle, bir müşterinin kodu yürütürken gördüğü biçimi not alın.