Oracle NLS_DATE_FORMAT无法正常工作

时间:2013-08-23 08:27:26

标签: oracle date oracle11g

在我的应用程序中,我设置会话的NLS_DATE_FORMAT以使用以下命令格式化程序返回的所有日期:

alter session set nls_date_format='DY DDTH MON YYYY';

这应该返回如下日期:'2013年8月23日星期五'

但是,如果我运行以下查询:

select SYSDATE from dual;

我按以下格式获取日期:'FRI 23 AUG 2013'。注意'23'之后缺少'rd'。

如果我运行以下查询:

select to_char(sysdate, 'DY DDTH MON YYYY') from dual;

日期确实以所需格式返回。那么为什么通过NLS_DATE_FORMAT设置'TH'日期格式参数不起作用?还有其他日期格式参数在使用TO_CHAR但不通过NLS_DATE_FORMAT时有效吗?

感谢您的帮助

顺便说一句,我使用的是Oracle 11.2客户端和数据库。

更新

我在SQL Developer中运行了alter session命令。我在SQL PLUS中尝试了这个,它以正确的格式返回日期。但是,现在我在插入格式化日期时遇到了问题。

如果我执行以下操作(在设置NLS_DATE_FORMAT之后),我得到'ORA-01861文字与格式字符串不匹配'错误:

INSERT INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18th Apr 2013');

我希望在设置NLS_DATE_FORMAT之后能够工作吗?

如果我将insert语句更改为:

INSERT INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18 Apr 2013');

然后它确实有效!这是为什么?

3 个答案:

答案 0 :(得分:2)

如果你这样做:

alter session set nls_date_format='DD DDTH MON YYYY';

您收到错误ORA-01810: format code appears twice

如果您使用与TO_CHAR相同的格式模型,那么它可以正常运行:

alter session set nls_date_format='DY DDTH MON YYYY';

Session altered.

select SYSDATE from dual;

SYSDATE
-----------------
FRI 23RD AUG 2013

这适用于SQL Developer和SQL * Plus。


有关插入的更新问题,datetime format documentation说:

  

关于日期格式元素后缀的注释:

     
      
  • 当您将其中一个后缀添加到日期时间格式元素时,返回值始终为英语。

  •   
  • 日期时间后缀仅对格式输出有效。您不能使用它们将日期插入数据库。

  •   

因此,您无法使用带后缀的字符串作为插入的一部分,无论是显式还是通过NLS_DATE_FORMAT。您必须将其从字符串中删除或定制格式模型以将其视为固定值。

答案 1 :(得分:1)

你在alter session语句中输入了一个拼写错误。在第一个地方设置DYE而不是DD

alter session set nls_date_format='DY DDTH MON YYYY';

答案 2 :(得分:1)

您可以将字符串文字'Thu 18th Apr 2013'插入到DATE数据类型的列中,如下所示(将th括在带双引号的格式模型中):

INSERT INTO DATE_TABLE (MY_DATE_COL) 
  VALUES (to_date('Thu 18th Apr 2013', 'Dy DD"th" Mon YYYY'));