plsql developer 中 TIMESTAMP 的显示格式

Oracle 中的 TIMESTAMP 数据类型很多人用的都很少,所以即使最简单的一个查询返回的结果也会搞不清楚到底这个时间是什么时间点。

例如:

27-1 月 -08 12.04.35.877000 上午

这个时间到底是几点呢?中午 12:04 分,那就错了,其实使用 to_char 函数转换后得到如下结果:

2008-01-27 00:04:35:877000

说明这个时间是凌晨的 00:04 分,而不是中午的 12:04 分。

发生此问题的原因如下:

示例:

SELECT TO_CHAR(TO_DATE('2008-01-29 00:05:10', 'yyyy-mm-dd hh24:mi:ss'),'yyyy-mm-dd hh:mi:ss am') FROM DUAL

首先把一个 00:05 分的时间进行转换,按照 'yyyy-mm-dd hh:mi:ss am' 格式进行转换,得到的结果是:

2008-01-29 12:05:10 上午

这说明 Oracle 在进行日期转换成字符串的过程中,如果小时转换使用的是 12 进制的格式,则凌晨 00 点会被认为是上午 12 点,然后才是上午 1 点、2 点、3 点。。。

oracle 中 12 进制的计时不是从 0-11,而是从 1-12 的,所以如果是夜里零点,你不能记成 1 点,那只能记成 12 点了。(不知道这是不是跟洋人的习惯有关?)


现在我们来看一下 Oracle 中对 TIMESTAMP 的处理:

SELECT VALUE FROM NLS_SESSION_PARAMETERS WHERE PARAMETER = 'NLS_TIMESTAMP_FORMAT'

返回结果 DD-MON-RR HH.MI.SSXFF AM,可以看到,这里默认情况下,使用的 TIMESTAMP 的格式是 12 进制的小时。

问题到这里已经找到根源了。


解决方法:

pl/sql developer 中读取的是注册表中设置的 NLS_TIMESTAMP_FORMAT 格式,那么只要在注册表中设置 Oracle 环境变量的地方(也就是设置 ORACLE_HOME 的地方)设置 NLS_TIMESTAMP_FORMAT 的格式(也就是创建这样一个字符串项,然后设置它的值为你转换需要的掩码,我一般设置为 YYYY-MM-DD HH24:MI:SS:FF6),然后关掉 PL/SQL DEVELOPER,再继续登陆,以后我们看到的 TIMESTAMP 时间就会自动转换成大家需要的格式了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章