为什么to_char函数可能会改变oracle中的日期

时间:2018-04-09 09:19:19

标签: oracle oracle11g

我使用select value,datetime,to_char(sensortime,'DD-MON-YYYY HH24:MI:SSxFF') datetime2 from test; 我发现datetime和datetime2不同,我怎样才能得到相同的结果? enter image description here

2 个答案:

答案 0 :(得分:2)

  

为什么to_char函数可能会更改oracle中的日期

我不会更改日期 - 它只会更改日期的格式。

SQL / Plus和SQL Developer通常使用NLS_TIMESTAMP_FORMAT会话参数隐式地将格式应用于TIMESTAMP数据类型。

您的查询是有效的:

SELECT value,
       TO_CHAR(
         sensortime,
         (
           SELECT VALUE
           FROM   NLS_SESSION_PARAMETERS
           WHERE  PARAMETER = 'NLS_TIMESTAMP_FORMAT'
         )
       ) AS datetime,
       to_char(sensortime,'DD-MON-YYYY HH24:MI:SSxFF') datetime2
FROM   test

查看输出,NLS_TIMESTAMP_FORMAT

'DD-MON-YYYY HH12:MI:SSxFF AM'

,您的格式为:

'DD-MON-YYYY HH24:MI:SSxFF'

这就是为什么他们提供不同的输出(一个是12小时制,另一个是24小时制)。

  

我怎样才能得到相同的结果?

更改您的查询以匹配NLS_TIMESTAMP_FORMAT

SELECT value,
       sensortime,
       TO_CHAR(sensortime,'DD-MON-YYYY HH12:MI:SSxFF AM') datetime2
FROM   test

或更改NLS_TIMESTAMP_FORMAT

ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SSxFF'

并使用您的查询。

答案 1 :(得分:1)

将会话NLS_TIMESTAMP_FORMAT更改为:

alter session set NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SSxFF';

如果您的专栏的数据类型为TIMESTAMP WITH TIME ZONE,则必须使用NLS_TIMESTAMP_TZ_FORMAT代替NLS_TIMESTAMP_FORMAT