在我的应用程序中,我设置会话的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');
然后它确实有效!这是为什么?
答案 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'));