簡體   English   中英

為什么 APEX 和 Oracle SQL Developer 中的日期格式不同?

[英]Why date formats are different in APEX and Oracle SQL Developer?

Oracle SQL Developer 中的日期格式類似於DD-MON-YY

例如17-OCT-03

APEX 中的日期格式類似於MM/DD/YYYY

例如12/17/1980

為什么它們不同?

這可能會導致相同的 SQL 查詢在兩個應用程序上都不起作用。

我知道我可以通過使用 TO_DATE 和 TO_CHAR 函數來避免這樣的問題,但我想了解這個問題背后的邏輯。

每個應用程序都使用自己的默認日期格式嗎?

是的,每個應用程序都有自己的日期格式。

甚至每個應用程序都可以有多個會話,每個會話都具有為 DATE 和 TIMESTAMP 指定的不同會話格式。

SQL Developer 在首選項、數據庫、NLS 頁面中定義了它的應用程序級別設置。 這就是 DATE 的顯示方式,除非您在 SQL 工作表中發出 ALTER SESSION SET...。

或者,如果無論此設置如何,您始終需要特定格式,請將其構建到您的查詢中。

select to_char(sysdate, 'DAY') today from dual;

在此處輸入圖片說明

這也是我的經驗......是的,每個 Oracle 應用程序/工具都可以有自己的默認日期格式,但大多數只是使用在數據庫級別設置的默認顯示格式:

SQL> select name, value from v$parameter where name = 'nls_date_format';

NAME                  VALUE
--------------------- ---------------------
nls_date_format       DD-Mon-YY

1 row selected.

但我不會將此描述為“一個問題”……它是一個有價值的特性,它為在基於 Oracle 的應用程序中顯示和輸入日期提供了很大的靈活性。

不過可以肯定的是,如果開發人員不了解 Oracle 日期的工作原理並編寫如下代碼:

-- BAD Coding
DECLARE
  ld_holiday_date DATE;
BEGIN
  -- Set a date type variable to a string value and
  -- hope that Oracle can figure out what I mean.
  ld_holiday_date := '01-JAN-2022';
END;

他們正在編寫特定於環境的代碼,這些代碼絕對不會在另一個數據庫(或會話)中工作,該數據庫與他們編寫代碼的數據庫(或會話)具有不同的 NLS_DATE_FORMAT。此外,上面的代碼必須進行隱式數據類型轉換(從字符串到日期),這將由 Oracle 嘗試找出字符串中的格式。

要針對 Oracle 日期編寫更具確定性的代碼,開發人員絕對應該使用 TO_DATE function。 這是上面代碼片段的防彈版本:

-- Good Coding
DECLARE
  ld_holiday_date DATE;
BEGIN
  -- I do not care what the NLS date format is in this
  -- database... this code will work everywhere.
  ld_holiday_date := TO_DATE ('01-JAN-2022', 'DD-MON-YYYY');
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM