2013-08-23 87 views
1

在我的应用我设置使用下面的命令格式化由程序返回的所有日期的会议NLS_DATE_FORMAT甲骨文NLS_DATE_FORMAT:工作不正常

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

这应返回的日期是这样的:“周五23 2013' 年8月

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

select SYSDATE from dual; 

我得到以下格式的日期: 'FRI 2013年8月23日'。注意'23'后缺少'rd'。

如果我运行下面的查询:

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

日期不回来所需的格式。那么为什么'TH'日期格式参数在通过NLS_DATE_FORMAT设置时不起作用?是否还有其他日期格式参数在使用TO_CHAR时可以工作,但不能通过NLS_DATE_FORMAT?

感谢您的帮助

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

UPDATE

我在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 INTO DATE_TABLE (MY_DATE_COL) VALUES ('Thu 18 Apr 2013'); 

然后它的工作!为什么是这样?

+0

DY DDTH MON YYYY – user1578653

回答

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说:

Notes on date format element suffixes:

  • When you add one of these suffixes to a datetime format element, the return value is always in English.

  • Datetime suffixes are valid only to format output. You cannot use them to insert a date into the database.

所以你不能使用带有后缀的字符串作为你的插件的一部分,无论是显式或通过NLS_DATE_FORMAT。您将不得不从字符串中删除它,或者将要处理的格式模型定制为固定值。

+0

注意:如果OP没有得到这个错误信息,他的应用程序可能没有做适当的错误检查。 –

+0

对不起,这是我的问题中的一个错字。我正在做你正在做的以上,我没有得到适当的日期格式。 – user1578653

+0

谢谢!我没有看到那些文档。我想最简单的解决方案是不允许我的用户在我的应用程序的日期格式中有后缀! – user1578653

1

您在更改会话陈述中有错字。设置DY而不是DD放在首位

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

抱歉,这是我的问题一个错字,我已经纠正它。 – user1578653

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')); 
+0

但是当我已经设置NLS_DATE_FORMAT时,是否需要使用to_date函数?我认为如果我将NLS_DATE_FORMAT更改为DY DDTH MON YYYY并尝试插入带有该格式的日期,它应该可以正常工作? – user1578653

+1

@ user1578653 - 您无论如何都隐式使用'to_date'函数,而用NLS_DATE_FORMAT代替第二个参数。在插入过程中,您只能使用后缀,仅用于显示。当然,在这个模型中,你需要处理'st','nd','rd'以及'th',并且可能是大写和小写。 –