[英]Getting date in oracle from timestamp without trailing o's?
我一直在搜索堆棧和谷歌以找到一種從時間戳中提取日期的方法,而尾隨零仍然是日期而不是 VARCHAR 變量-
例如:
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL
給: 18-JUL-12 00:00:00
最后我希望它采用“ '18/07/2012'
日期格式。
如果可能,請提前 TIA。
嗯,這就是你說的。 在我的數據庫中,它導致
SQL> SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
TRUNC(TO
--------
18.07.12
SQL>
如果您想獲得不同的結果,請更改 session:
SQL> alter session set nls_Date_format = 'dd/mm/yyyy';
Session altered.
SQL> SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
TRUNC(TO_D
----------
18/07/2012
或者使用所需的格式掩碼應用TO_CHAR
:
SQL> SELECT to_char(TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')), 'dd/mm/yyyy') FROM DUAL;
TO_CHAR(TR
----------
18/07/2012
雖然,我認為你在做什么沒有多大意義:
那么,你為什么不直接使用
SQL> select '18/07/2012' from dual;
'18/07/201
----------
18/07/2012
(當然,除非該日期字符串實際上來自錯誤的表的某個位置;永遠不要將日期存儲到VARCHAR2
列中)。
數據類型 DATE 和 TIMESTAMP 是 oracle 內部二進制類型。 根據定義,它們包含一個時間組件 - DATE 解析為秒,TIMESTAMP 解析為納秒。 相反,由於這些是內部的二進制結構,因此您在屏幕上看到的內容再次按定義轉換為字符串 - VARCHAR2。 您可能沒有指定 TO_CHAR,但是選擇要顯示的 DATE 或 TIMESTAMP(未在內部使用)的行為迫使oracle 對其應用 TO_CHAR。
由於根據定義,這些數據類型固有地包含時間組件,因此在邏輯上說您要“從時間戳中提取日期而尾隨零(時間組件)仍然是日期而不是 VARCHAR 變量 - ”。
我一直在搜索堆棧和谷歌以找到一種從時間戳中提取日期的方法,而尾隨零仍然是日期而不是
VARCHAR
變量
如果您希望該值仍然是DATE
,則不能
DATE
在內部存儲為7 個字節,並且始終具有年(2 個字節)、月、日、小時、分鍾和秒(每個 1 個字節)分量。
TIMESTAMP
在內部存儲 11-20 個字節,具有與DATE
相同的年到秒組件,但也有小數秒組件和可選的時區組件。
DATE
和TIMESTAMP
都沒有格式,因為它們只是二進制數據,並且您無法刪除時間組件,因為它們都始終具有時間組件。
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL
給:
18-JUL-12 00:00:00
該查詢輸出一個DATE
並且根據您使用的用戶界面,日期可能會被隱式轉換為字符串以進行輸出。 SQL/Plus 和 SQL 開發人員使用NLS_DATE_FORMAT
session 參數在向用戶顯示DATE
時將其隱式轉換為字符串:
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
輸出: 2012-07-18 13:27:18
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD';
SELECT TRUNC(to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS')) FROM DUAL;
輸出: 2012-07-18
但是,任何用戶都可以隨時更改自己的session參數,因此您永遠不應依賴日期的隱式格式。
如果你想要一個DATE
,那么你不應該期望它以任何特定的方式格式化,因為它只是二進制數據。 如果您想要一個格式化的日期,那么您應該使用TO_CHAR
將其顯式轉換為具有所需格式的字符串:
SELECT TO_CHAR(
TRUNC( to_date('2012-07-18 13:27:18', 'YYYY-MM-DD HH24:MI:SS') ),
'DD/MM/YYYY'
)
FROM DUAL;
輸出: 18/07/2012
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.