3 回答
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
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';
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()
- 3 回答
- 0 關注
- 145 瀏覽
添加回答
舉報
