簡體   English   中英

TO_CHAR和TO_DATE給出不同的結果。如何使用TO_DATE實現TO_CHAR功能?

[英]TO_CHAR and TO_DATE giving different results.How to achieve the TO_CHAR functionality using TO_DATE?

SELECT TO_CHAR((select logical_date -1 from logical_date 
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

此查詢返回23/04/2016 00:00:00

o/p of select logical_date -1 from logical_date where logical_date_type='B' :4/23/2016

SELECT TO_DATE((select logical_date -1 from logical_date 
where logical_date_type='B'),'DD/MM/YYYY HH24:MI:SS') FROM DUAL;

此查詢4/23/0016返回。

如何使用TO_DATE獲取TO_CHAR給出的格式?

日期沒有任何內在格式。 Oracle有一個內部表示,看起來不像你認為的任何日期。 客戶端或應用程序決定如何顯示日期(例如,使用NLS_DATE_FORMAT),或者您可以使用TO_CHAR將日期轉換為具有您指定格式的字符串,就像您在第一個示例中所做的那樣。

在你的第二個例子中,你正在使用你的NLS設置對你的實際日期進行隱式轉換 - 在這個過程中失去了世紀,所以可能是YY而不是YYYY - 然后你將它轉換回一個日期。 我很驚訝,因為你正在交換月和日的位置,所以沒有錯誤。

不要那樣做。 即使您的設置沒有丟失信息,轉換為字符串並返回日期也毫無意義。

如果您希望將其作為客戶端或其他進程的日期使用,請執行以下操作:

select logical_date -1
from logical_date 
where logical_date_type='B'

如果您想與另一個日期進行比較,請將其保留為日期:

select other_columns
from logical_date 
where logical_date_type='B'
and logical_date -1 < sysdate

如果要指定顯示格式,請使用:

select to_char(logical_date -1, 'DD/MM/YYYY')
from logical_date 
where logical_date_type='B'

該問題與您在oracle客戶端設置中配置的會話的默認日期格式有關要檢查會話的NLS_DATE_FORMAT設置

SELECT value
FROM   nls_session_parameters
WHERE  parameter = 'NLS_DATE_FORMAT'

以下是如何更改會話的此設置以獲得所需結果:

alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS';

如何使用TO_DATE獲取TO_CHAR給出的格式?

首先, DATE沒有任何格式。 Oracle不會以您看到的格式存儲日期。 它在內部存儲7個字節 ,每個字節存儲d atetime值的不同分量。

Byte    Description
----    -------------------------------------------------
1       Century value but before storing it add 100 to it
2       Year and 100 is added to it before storing
3       Month
4       Day of the month
5       Hours but add 1 before storing it
6       Minutes but add 1 before storing it
7       Seconds but add 1 before storing it

格式僅用於顯示目的。 TO_DATE用於將文字轉換為日期,與格式無關。 要以所需格式顯示日期,請使用TO_CHAR和正確的格式化模型

另外,請記住,格式化具有優先順序

讓我們看看優先順序時間順序 ,即從最高到最低:

  • 單個SQL語句中使用TO_CHARTO_DATE

  • ALTER SESSION SET NLS_DATE_FORMAT='whatever format model you want';

  • 將其設置為客戶端計算機上的OS環境變量

  • NLS_DATE_FORMAT設置在數據庫初始化參數中

例如,

單個SQL語句:

SQL> SELECT HIREDATE, TO_CHAR(hiredate, 'YYYY-MM-DD') FROM emp;

HIREDATE            TO_CHAR(HI
------------------- ----------
17/12/1980 00:00:00 1980-12-17
20/02/1981 00:00:00 1981-02-20
22/02/1981 00:00:00 1981-02-22
02/04/1981 00:00:00 1981-04-02
28/09/1981 00:00:00 1981-09-28
01/05/1981 00:00:00 1981-05-01
09/06/1981 00:00:00 1981-06-09
09/12/1982 00:00:00 1982-12-09
17/11/1981 00:00:00 1981-11-17
08/09/1981 00:00:00 1981-09-08
12/01/1983 00:00:00 1983-01-12
03/12/1981 00:00:00 1981-12-03
03/12/1981 00:00:00 1981-12-03
23/01/1982 00:00:00 1982-01-23

14 rows selected.

會話級別:

SQL> alter session set nls_date_format='YYYY-MM-DD';

Session altered.

SQL> SELECT hiredate FROM emp;

HIREDATE
----------
1980-12-17
1981-02-20
1981-02-22
1981-04-02
1981-09-28
1981-05-01
1981-06-09
1982-12-09
1981-11-17
1981-09-08
1983-01-12
1981-12-03
1981-12-03
1982-01-23

14 rows selected.

SQL>

TO_DATE((選擇logical_date

這是錯的。

永遠不要在DATE列上申請TO_DATE 它迫使Oracle:

  • 首先將其轉換為字符串
  • 然后將其轉換回日期

基於特定語言環境的NLS設置 您需要TO_DATE將文字轉換為日期。 對於日期算術 ,請保留日期。

暫無
暫無

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

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