我有幾個時間字段是INTERVAL DAY(0)到SECOND(0)數據類型來存儲一天中的不同時間。格式化INTERVAL DAY(0)TO SECOND(0)
目前正常檢索,我的領域顯示爲這樣:
+00 19:00:00.000000
我怎麼能格式化這個使得其顯示爲19:00?
我有幾個時間字段是INTERVAL DAY(0)到SECOND(0)數據類型來存儲一天中的不同時間。格式化INTERVAL DAY(0)TO SECOND(0)
目前正常檢索,我的領域顯示爲這樣:
+00 19:00:00.000000
我怎麼能格式化這個使得其顯示爲19:00?
與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'。
你想要一個時間間隔的小時和分鐘。如果間隔時間不能超過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
間隔不應該> = 24小時; OP表示他們使用這種數據類型**來存儲當天的不同時間**。 – mathguy
應該沒有消極的間隔。 OP表示他們使用這種數據類型**來存儲當天的不同時間**。 – mathguy