從查詢訪問的Java函數比SQL函數的工作量要多得多,所以我不完全確定你的意思。您不能像查詢混合SQL和PL/SQL上下文一樣使用查詢來聲明函數。
您的轉換看起來不必要的複雜;你可以這樣做:
的numtodsinterval
function需要你的時間差並將其轉換爲一個間隔的數據類型,以及substr
得到覆蓋小時和分鐘一節。
稍微表現雖然有所不同,因爲它會截斷而不是相反分鐘:
with tmp as (
select to_date('2013-04-11 13:17:15', 'YYYY-MM-DD HH24:MI:SS')
- to_date('2013-04-11 12:57:38', 'YYYY-MM-DD HH24:MI:SS')
as date_difference
from dual
union all
select to_date('2013-04-11 11:11:35', 'YYYY-MM-DD HH24:MI:SS')
- to_date('2013-04-10 22:40:45', 'YYYY-MM-DD HH24:MI:SS')
from dual
union all
select to_date('2013-04-11 00:59:59', 'YYYY-MM-DD HH24:MI:SS')
- to_date('2013-04-11 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
from dual
)
select LTRIM(TO_CHAR(TRUNC((DATE_DIFFERENCE) * 24),'00')) || ':' ||
LTRIM(TO_CHAR(MOD(ROUND((DATE_DIFFERENCE)*24*60),60),'00')),
substr(numtodsinterval(date_difference, 'DAY'), 12, 5)
from tmp;
LTRIM(T SUBSTR(NUMTODSINTERV
------- --------------------
00:20 00:19
12:31 12:30
00:00 00:59
對於那些全間隔爲:
NUMTODSINTERVAL(DATE_DIFFERENCE,'DAY')
---------------------------------------------------------------------------
+000000000 00:19:37.000000000
+000000000 12:30:50.000000000
+000000000 00:59:59.000000000
所以很明顯第一個將四捨五入到00:20
,但截斷爲00:19
。正如Egor Skriptunoff在評論中指出的那樣,你對第三個計算的計算給了你一個不正確的答案,這就是我現在包含它的原因。
這將全面分鐘,但時間長一點:
to_char(round(date '2001-01-01' + date_difference, 'MI'), 'HH24:MI')
的文字,在那裏我使用date '2001-01-01'
使用實際的日期,也沒有關係,它可以是任何一天,你例如可以使用trunc(sysdate)
。它只是允許您將差異轉換回DATE
對象,然後您可以使用內置的round(date)
function。對於比較:
with tmp as (...)
select LTRIM(TO_CHAR(TRUNC((DATE_DIFFERENCE) * 24),'00')) || ':' ||
LTRIM(TO_CHAR(MOD(ROUND((DATE_DIFFERENCE)*24*60),60),'00')),
substr(numtodsinterval(date_difference, 'DAY'), 12, 5),
to_char(trunc(date '2001-01-01' + date_difference, 'MI'), 'HH24:MI'),
to_char(round(date '2001-01-01' + date_difference, 'MI'), 'HH24:MI')
from tmp;
LTRIM(T SUBSTR(NUMTODSINTERV TO_CH TO_CH
------- -------------------- ----- -----
00:20 00:19 00:19 00:20
12:31 12:30 12:30 12:31
00:00 00:59 00:59 01:00
這些都不其實是給予你想要的東西,嵌入式特設功能,但至少如果邏輯更清晰,然後再使用它可能不是這樣的擔心。用SQL函數包裝它仍然可能不是一個可怕的選擇。
此邏輯錯誤,例如當DATE_DIFFERENCE = 59分59秒 –
@EgorSkriptunoff - 好點;我在回答中將這個數據點添加到了示例中以證明問題。 –
爲什麼你想避免創建oracle函數? –