Conséquences de la modification NLS_TIMESTAMP_FORMAT


4

J'administre une base de données 9.2.0.8 dans laquelle NLS_TIMESTAMP_FORMAT est défini sur 'DD-MON-RR HH.MI.SSXFF AM';.

Cela conduit à des résultats étranges lorsque vous utilisez la fonction CAST TO TIMESTAMP:

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

Si je modifie le NLS_TIMESTAMP_FORMAT à 'DD-MON-YYYY HH.MI.SSXFF AM' alors je suis bon pour aller.

La modification du paramètre NLS_TIMESTAMP_FORMAT sur la base de données en YYYY aurait-elle des conséquences?

4

Le niveau base de donnéesNLS_DATE_FORMATetNLS_TIMESTAMP_FORMATles paramètres ne sont pas particulièrement utiles car ils sont toujours remplacés par les paramètres du client.Ainsi, même si vous modifiez le paramètre de base de données, plus de 99% du temps lorsqu'un utilisateur arrive et se connecte à la base de données, sa session va définir uneNLS_DATE_FORMATetNLS_TIMESTAMP_FORMATbasé sur le clientNLS_LANGou d'autres paramètres de langue nationale (les applications utilisant le pilote JDBC léger utilisent les paramètres d'internationalisation de la machine virtuelle Java plutôt que de compter sur le client)NLS_LANG) et remplacez le paramètre que vous avez défini dans la base de données.Il existe quelques cas critiques impliquant des travaux de base de données utilisantDBMS_JOBSouDBMS_SCHEDULERoù il n'y a pas de client où la base de donnéesNLS_DATE_FORMATetNLS_TIMESTAMP_FORMATsont utilisés, je crois, mais ceux-ci sont plutôt rares.

Vous pouvez créer un déclencheur de connexion qui a fait unALTER SESSIONpour définir leNLS_DATE_FORMATetNLS_TIMESTAMP_FORMATpour vos sessions.Cela annulerait les paramètres demandés par le client lors de la création de la session.Comme Nick le fait remarquer, vous devrez vous inquiéter du fait que d'autres requêtes s'appuient sur le paramètre actuel pour les conversions implicites et votre modification risque de rompre ce code.

En règle générale, il vaut mieux éviter les conversions implicites dans la mesure du possible, mais particulièrement lorsqu'il s'agit de convertir des chaînes en dates ou en horodatages, simplement parce qu'il existe de nombreux formats différents qui vous posent problème.Si vous souhaitez spécifier un littéral de date dans votre code, il vaut mieux utiliser la syntaxe ANSI pour la date et l'horodatage.

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

Si vous voulez convertir une chaîne en une date ou un horodatage, vous feriez mieux d'utiliser unTO_DATEou unTO_TIMESTAMPavec un masque de format explicite.


0

Les requêtes existantes qui reposent sur ce format peuvent renvoyer des résultats différents.

Vérifiez que votre code existant interprète les champs TIMESTAMP d'une manière dépendant du format et assurez-vous de le mettre à jour le cas échéant. Notez également que NLS_TIMESTAMP_FORMAT peut être défini au niveau de la base de données ou du client. Prenez donc note du format que le client voit lorsqu'il exécute du code.