簡體   English   中英

從時間戳中獲取 oracle 中的日期而不使用尾隨 o?

[英]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

雖然,我認為你在做什么沒有多大意義:

  • 首先將字符串 ('2012-07-18 13:27:18') 轉換為日期
  • 然后你截斷時間的一部分
  • 最后,您只想獲取日期部分,但再次作為字符串

那么,你為什么不直接使用

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相同的年到秒組件,但也有小數秒組件和可選的時區組件。

DATETIMESTAMP都沒有格式,因為它們只是二進制數據,並且您無法刪除時間組件,因為它們都始終具有時間組件。

 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

db<>小提琴

暫無
暫無

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

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