2017-07-19 45 views
1

我有幾個時間字段是INTERVAL DAY(0)到SECOND(0)數據類型來存儲一天中的不同時間。格式化INTERVAL DAY(0)TO SECOND(0)

目前正常檢索,我的領域顯示爲這樣:

+00 19:00:00.000000

我怎麼能格式化這個使得其顯示爲19:00?

回答

0

documentation相抵觸,您不能使用功能TO_CHAR()作爲間隔。它允許使用INTERVAL值,但結果始終相同。在另一個地方documentation說:

區間數據類型沒有格式模型。

您可以使用EXTRACT()功能,或者您可以使用正則表達式的工作:

WITH t AS 
    (SELECT INTERVAL '19' HOUR + INTERVAL '30' MINUTE AS i FROM dual) 
SELECT 
    LPAD(EXTRACT(HOUR FROM i), 2, '0')||':'||LPAD(EXTRACT(MINUTE FROM i), 2, '0'), 
    REGEXP_SUBSTR(i, '\d{2}:\d{2}') 
FROM t; 

通常它是不是很聰明使用日期/時間值的正則表達式。另一方面,由於INTERVAL的格式確實是而不是取決於任何NLS-設置,所以這是一個可行的選擇。

EXTRACT的缺點是當你有負的間隔。這樣的間隔將被編寫爲-19:-30,因爲每個組件都帶有減號( - )。另請注意,EXTRACT返回的值爲NUMBER,因此您必須手動將它們填充爲'0'。

+0

應該沒有消極的間隔。 OP表示他們使用這種數據類型**來存儲當天的不同時間**。 – mathguy

0

你想要一個時間間隔的小時和分鐘。如果間隔時間不能超過24小時,那麼你可以間隔添加到日期沒有時間部分,然後用TO_CHAR得到格式化小時和分鐘:

select to_char(trunc(sysdate) + myinterval, 'hh24:mi') from mytable 

但是,如果間隔可以更大(例如, 100小時15分鐘:100:15),那麼你就需要另一種方法:

select 
    to_char(extract (day from myinterval) * 24 + extract (hour from myinterval)) || 
    ':' || 
    to_char(extract (minute from myinterval), 'fm00') 
from mytable 
+0

間隔不應該> = 24小時; OP表示他們使用這種數據類型**來存儲當天的不同時間**。 – mathguy

1

使用

substr(to_char(interval_value), 5, 5) 

其中interval_value是列名(順便說一句,關係數據庫中的表沒有字段;他們確實有專欄)。

+0

似乎沒有工作。它給我帶來「字符串對於內部緩衝區來說太長」異常 – ABB25

+0

@ ABB25 - ** Huh **?你在運行什麼代碼?錯誤不是從我在解決方案中寫出的。 – mathguy

相關問題