[英]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_CHAR或TO_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.