我管理一个 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
产生任何后果吗?
数据库级别
NLS_DATE_FORMAT
和NLS_TIMESTAMP_FORMAT
参数并不是特别有用,因为它们总是被客户端设置覆盖。因此,即使您更改数据库设置,当用户出现并连接到数据库时,99% 以上的时间,他们的会话将NLS_DATE_FORMAT
根据NLS_TIMESTAMP_FORMAT
客户端NLS_LANG
或其他国家语言设置(即使用瘦 JDBC 的应用程序驱动程序使用 JVM 的国际化设置而不是依赖于客户端NLS_LANG
)并否决您在数据库中所做的设置。我相信有一些涉及使用数据库作业DBMS_JOBS
或DBMS_SCHEDULER
没有使用数据库NLS_DATE_FORMAT
和NLS_TIMESTAMP_FORMAT
使用客户端的客户端的极端案例,但这些情况相当罕见。您可以创建一个登录触发器
ALTER SESSION
来为您的会话设置NLS_DATE_FORMAT
和NLS_TIMESTAMP_FORMAT
。这将否决客户端在创建会话时请求的设置。正如尼克指出的那样,您必须担心其他查询依赖于当前设置进行隐式转换,并且您的更改可能会破坏该代码。一般来说,尽可能避免隐式转换会更好,特别是在将字符串转换为日期和时间戳或从日期和时间戳转换时,因为有太多不同的格式,您正在为自己设置问题。如果要在代码中指定日期文字,最好使用 ANSI 日期和时间戳语法
如果要将字符串转换为日期或时间戳,最好使用带有显式格式掩码的a
TO_DATE
或 a 。TO_TIMESTAMP
依赖此格式的现有查询可能会返回不同的结果。
检查您现有的代码是否以
TIMESTAMP
与格式相关的方式解释字段,如果是,请务必更新它。另请注意,NLS_TIMESTAMP_FORMAT
可以在数据库或客户端级别设置,因此请注意客户端在执行代码时看到的格式。