[英]Oracle SQL invalid number on toad
我已經做了這個查詢,但是當我執行它時,我收到了關於“無效數字”的錯誤。 但是在 SQL Developer for Oracle 中,沒有錯誤; 我得到了我想要的結果,但在 Toad 中我得到了 'Invalid Number' 。
DECLARE v_rep number;
BEGIN
EXECUTE IMMEDIATE
'SELECT to_number(REPLACE(max(substr(to_char(r_timestamp_arr,''HH24:MI''),1,2) ||
ltrim(to_char(round(to_number(Substr(to_char(r_timestamp_arr, ''HH24:MI''),4,2)) /
60,2),''.00''))), ''.'', '','')) -
to_number(REPLACE(MIN(substr(to_char(r_timestamp_arr,''HH24:MI''),1,2) ||
ltrim(to_char(round(to_number(Substr(to_char(r_timestamp_arr, ''HH24:MI''),4,2)) /
60,2),''.00''))), ''.'', '',''))
FROM TV_MAX
WHERE TV_UID = ''7a87e8e4861a4d0aae65da1a7248b256'''
INTO v_rep;
END ;
您不需要EXECUTE IMMEDIATE
也不需要使用字符串:
甲骨文設置:
CREATE TABLE tv_max ( tv_uid, r_timestamp_arr ) AS
SELECT '7a87e8e4861a4d0aae65da1a7248b256', DATE '2019-12-27' + INTERVAL '00:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT '7a87e8e4861a4d0aae65da1a7248b256', DATE '2019-12-27' + INTERVAL '01:30' HOUR TO MINUTE FROM DUAL;
查詢 1 :
如果要忽略日期和時間的日期部分:
DECLARE
v_rep NUMBER;
BEGIN
SELECT ( MAX( r_timestamp_arr - TRUNC( r_timestamp_arr ) )
- MIN( r_timestamp_arr - TRUNC( r_timestamp_arr ) )
) * 24
INTO v_rep
FROM tv_max
WHERE TV_UID = '7a87e8e4861a4d0aae65da1a7248b256';
DBMS_OUTPUT.PUT_LINE( v_rep );
END;
/
查詢 2 :
如果您想要關於日期組件的最小值/最大值,那么查詢可以更簡單:
DECLARE
v_rep NUMBER;
BEGIN
SELECT ( MAX( r_timestamp_arr ) - MIN( r_timestamp_arr ) ) * 24
INTO v_rep
FROM tv_max
WHERE TV_UID = '7a87e8e4861a4d0aae65da1a7248b256';
DBMS_OUTPUT.PUT_LINE( v_rep );
END;
/
輸出:
對於測試數據,兩個輸出:
\n 1.5\n
db<> 在這里擺弄
看起來您想知道最大和最小小時(包括分鍾,不包括秒)之間的區別,日期部分被截斷。 因此,截斷時間,減去日期,您將得到以天為單位的結果,乘以 24,結果將以小時為單位。 查詢不依賴於 NLS 設置:
select 24 * (to_date(max(to_char(r_timestamp_arr, 'hh24:mi')), 'hh24:mi')
- to_date(min(to_char(r_timestamp_arr, 'hh24:mi')), 'hh24:mi')) as diff
from tv_max
where tv_uid = '7a87e8e4861a4d0aae65da1a7248b256'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.