2008-10-01 15 views

回答

25

由於DATE的精度是第二個(也沒有秒的小數部分),所以完全不需要TRUNC

數據類型TIMESTAMP允許秒的小數部分。如果您將其轉換爲DATE,則會移除小數秒 - 例如,

select cast(systimestamp as date) 
    from dual; 
1

要截斷timestamp到秒就可以將它轉換爲一個日期:

CAST(timestamp AS DATE) 

要那麼執行本文中的TRUNC的:

TRUNC(CAST(timestamp AS DATE), 'YEAR') 
0

東西的順序:

select to_char(current_timestamp, 'SS') from dual; 
1

我用這樣的功能:

FUNCTION trunc_sec(p_ts IN timestamp) 
IS 
    p_res timestamp; 
BEGIN 
    RETURN TO_TIMESTAMP(TO_CHAR(p_ts, 'YYYYMMDDHH24MI'), 'YYYYMMDDHH24MI'); 
END trunc_sec; 
+2

我認爲這是要走的路,因爲與大多數這些答案不同,它獨立於Oracle的版本。但這並不完全正確 - 你錯過了秒數。應該是這樣的: to_date(to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') – delany 2013-08-02 14:49:40

3

我很抱歉,但我所有的前輩似乎是錯​​誤的:

SELECT CAST( systimestamp as date)from dual不會截斷,但可以輪到下一秒。

我用一個函數:

CREATE OR REPLACE FUNCTION TRUNC_TS(TS IN TIMESTAMP) RETURN DATE AS 
BEGIN 
    RETURN TS; 
END; 

SELECT systimestamp, trunc_ts(systimestamp) date_trunc, 
    CAST(systimestamp AS DATE) date_cast FROM dual 

SYSTIMESTAMP      DATE_TRUNC    DATE_CAST 
21.01.10 15:03:34,567350 +01:00 21.01.2010 15:03:34 21.01.2010 15:03:35 
+0

我運行了你的代碼,但是不能重現你的發現。在幾十個測試中(其中大部分會受到四捨五入的影響),三個結果之間的秒數永遠不會有差異。你在什麼版本的Oracle? (我在11.2)。 – 2010-11-24 16:07:50

相關問題