首頁 > 資料庫 > mysql教程 > Oracle 中的預設日期格式是什麼?

Oracle 中的預設日期格式是什麼?

DDD
發布: 2025-01-16 16:36:09
原創
978 人瀏覽過

What's the Default Date Format in Oracle and Why is it Inconsistent?

Oracle 資料庫的預設日期格式是什麼?

儘管文件中指明了多種預設日期格式,但 Oracle 日期實際上並沒有固定的格式。它們以 7 個位元組的內部格式存儲,分別表示年(2 位元組)、月、日、時、分、秒(每個 1 位元組)。

為什麼會有這麼多互相衝突的訊息?

這是由於 NLS_DATE_FORMAT 會話參數所導致的。此參數作為預設格式,會根據使用者的地區設定而有所不同。因此,當使用者進行明確字串到日期的轉換或隱式轉換時,就會出現格式不一致的情況。 Oracle 在隱式字串到日期轉換時,會嘗試根據 NLS_DATE_FORMAT 參數來解釋字串,從而導致不一致性。

推薦實作

為了避免混淆,建議採用以下方法:

  • 日期字面量: DATE '2018-01-25'
  • 時間戳字面量: TIMESTAMP '2018-01-25 01:23:45'
  • 明確 TO_DATE 轉換: TO_DATE('25-JUN-18', 'DD-MON-RR')

修改 NLS_DATE_FORMAT

要更改會話中的 NLS_DATE_FORMAT,請使用以下命令:

<code class="language-sql">ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';</code>
登入後複製

NLS_DATE_FORMAT 的預設值

NLS_DATE_FORMAT 的預設值取決於 NLS_TERRITORY 會話參數,該參數表示使用者的區域設定。若要查看不同地區使用的格式,請執行以下查詢:

<code class="language-sql">SET SERVEROUTPUT ON;

VARIABLE cur REFCURSOR;

DECLARE
  territories SYS.ODCIVARCHAR2LIST;
  formats     SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
BEGIN
  SELECT value
  BULK COLLECT INTO territories
  FROM v$nls_valid_values
  WHERE parameter = 'TERRITORY'
  ORDER BY value;

  formats.EXTEND(territories.COUNT);
  FOR i IN 1 .. territories.COUNT LOOP
    EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_TERRITORY='''||territories(i)||'''';

    SELECT value
    INTO formats(i)
    FROM NLS_SESSION_PARAMETERS
    WHERE PARAMETER = 'NLS_DATE_FORMAT';
  END LOOP;

  OPEN :cur FOR
  SELECT f.format AS format,
         LISTAGG(t.territory, ', ') WITHIN GROUP (ORDER BY t.territory) AS territories
  FROM (SELECT ROWNUM AS rn, COLUMN_VALUE AS territory FROM TABLE(territories)) t
         INNER JOIN
         (SELECT ROWNUM AS rn, COLUMN_VALUE AS format FROM TABLE(formats)) f
         ON (f.rn = t.rn)
  GROUP BY f.format;
END;
/

PRINT :cur;</code>
登入後複製

以上是Oracle 中的預設日期格式是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板