首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文NLS_TERRITORY重写NLS_DATE_FORMAT

甲骨文NLS_TERRITORY重写NLS_DATE_FORMAT
EN

Stack Overflow用户
提问于 2020-02-07 09:10:59
回答 3查看 3K关注 0票数 0

在PHP应用程序中,我指定

代码语言:javascript
复制
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';

输出数据格式为预期的2020-01-31 21:21:47,但当我添加

代码语言:javascript
复制
ALTER SESSION SET NLS_TERRITORY = 'CIS';

NLS_DATE_FORMAT不起作用,NLS_TERRITORY重写它。31.01.20

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-07 09:26:03

nls_date_format (以及其他设置)是从nls_territory派生的。因此,在设置区域时,数据库还将此区域的日期格式设置为默认值:

代码语言:javascript
复制
select value from nls_session_parameters
where  parameter = 'NLS_DATE_FORMAT';

VALUE
--------------------------------------------------------------------------------
DD-MON-RR

ALTER SESSION SET NLS_TERRITORY = 'CIS';

select value from nls_session_parameters
where  parameter = 'NLS_DATE_FORMAT';

VALUE
--------------------------------------------------------------------------------
DD.MM.RR

因此,您需要在领土之后设置日期格式:

代码语言:javascript
复制
ALTER SESSION SET NLS_TERRITORY = 'CIS';
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';
select value from nls_session_parameters
where  parameter = 'NLS_DATE_FORMAT';

VALUE
--------------------------------------------------------------------------------
YYYY-MM-DD HH24:MI:SS

或者--更好的是--在转换中使用显式格式掩码:

代码语言:javascript
复制
ALTER SESSION SET NLS_TERRITORY = 'CIS';
select sysdate, to_char ( sysdate, 'YYYY-MM-DD HH24:MI:SS' ) from dual;

SYSDATE  TO_CHAR(SYSDATE,'YY
-------- -------------------
07.02.20 2020-02-07 09:25:35
票数 2
EN

Stack Overflow用户

发布于 2020-02-07 09:40:21

甲骨文的默认日期格式取决于NLS_TERRITORY设置。因此,当您设置NLS_TERRITORY时,您还告诉甲骨文将NLS_DATE_FORMAT (和其他类似参数)重置为新领域的默认设置。

来自Oracle文档

1.206 NLS_TERRITORY NLS_TERRITORY指定每天和每周都要遵守惯例的地区的名称。 ..。 此参数还建立默认日期格式、默认小数字符和组分隔符以及默认ISO和本地货币符号。 有关这些设置的信息,请参阅"NLS_DATE_FORMAT“、"NLS_NUMERIC_CHARACTERS”、"NLS_CURRENCY“和"NLS_ISO_CURRENCY”。

如果要更改区域和日期语言和格式,则需要首先更改区域(这将隐式地将NLS_DATE_FORMAT的值等更改为地区的默认值),然后可以更改日期语言和格式以覆盖这些默认区域设置:

所以:

代码语言:javascript
复制
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';
ALTER SESSION SET NLS_TERRITORY = 'CIS';

应:

代码语言:javascript
复制
ALTER SESSION SET NLS_TERRITORY = 'CIS';
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
ALTER SESSION SET NLS_DATE_LANGUAGE = 'RUSSIAN';
票数 2
EN

Stack Overflow用户

发布于 2020-02-07 22:08:36

除了其他答案之外,您还应该将设置组合成一个ALTER SESSION语句:

代码语言:javascript
复制
ALTER SESSION SET NLS_TERRITORY = 'CIS' NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS' NLS_DATE_LANGUAGE = 'RUSSIAN';

如果您要从PHP执行语句(而不仅仅是通过PL/SQL块或登录触发器),则特别建议这样做,因为它减少了PHP与数据库之间的往返次数,并具有显著的性能效益。

有关使用触发器的讨论,请参阅免费Oracle 地下PHP和Oracle手册的p 304。

如果您确实需要从PHP执行语句,并且有其他在登录时执行的SQL命令,请将它们包装在一个匿名PL/SQL块中:

代码语言:javascript
复制
begin
     execute immediate
       'alter session set nls_date_format = ''YYYY-MM-DD'' nls_language = AMERICAN';
     -- other SQL statements could be put here
end;

这可以通过一个oci_parse()调用来执行,所以它只需要一次往返。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60110325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档