在PHP应用程序中,我指定
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,但当我添加
ALTER SESSION SET NLS_TERRITORY = 'CIS';NLS_DATE_FORMAT不起作用,NLS_TERRITORY重写它。31.01.20
发布于 2020-02-07 09:26:03
nls_date_format (以及其他设置)是从nls_territory派生的。因此,在设置区域时,数据库还将此区域的日期格式设置为默认值:
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因此,您需要在领土之后设置日期格式:
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或者--更好的是--在转换中使用显式格式掩码:
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发布于 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的值等更改为地区的默认值),然后可以更改日期语言和格式以覆盖这些默认区域设置:
所以:
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';应:
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';发布于 2020-02-07 22:08:36
除了其他答案之外,您还应该将设置组合成一个ALTER SESSION语句:
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块中:
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()调用来执行,所以它只需要一次往返。
https://stackoverflow.com/questions/60110325
复制相似问题