为了账号安全,请及时绑定邮箱和手机立即绑定

甲骨文NLS_TERRITORY覆盖NLS_DATE_FORMAT

甲骨文NLS_TERRITORY覆盖NLS_DATE_FORMAT

PHP
富国沪深 2022-09-12 09:18:35
在 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
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

(以及其他设置)派生自 。因此,当您设置区域时,数据库还会将日期格式设置为此区域的默认格式:nls_date_formatnls_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



查看完整回答
反对 回复 2022-09-12
?
白衣非少年

TA贡献1155条经验 获得超0个赞

Oracle 的默认日期格式取决于设置。因此,当您设置时,您还告诉Oracle将(和其他类似参数)重置为新区域的默认值。NLS_TERRITORYNLS_TERRITORYNLS_DATE_FORMAT

甲骨文文档中

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';


查看完整回答
反对 回复 2022-09-12
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

除了其他答案之外,您还应该将设置合并到一个语句中: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 和数据库之间的往返次数,并且可以显著提高性能。


有关使用触发器的讨论,请参阅免费的甲骨文 PDF 地下 PHP 和甲骨文手册的第 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()


查看完整回答
反对 回复 2022-09-12
  • 3 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信