求oracle小时加减运算方法

eiwang 2011-02-12 01:31:35
如:
v_arg1 IN NUMBER,v_arg2 IN NUMBER
需求:
参数1: v_arg1 (如:v_arg1:=900.10 即900小时零10分钟
参数2: v_arg2 (如:v_arg2:=800.20 即800小时零20分钟

需要得到结果:v_arg1 - v_arg2 (即:99.50)即得到99小时零50分钟。
...全文
177 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
心中的彩虹 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 eiwang 的回复:]
如:
v_arg1 IN NUMBER,v_arg2 IN NUMBER
需求:
参数1: v_arg1 (如:v_arg1:=900.10 即900小时零10分钟)
参数2: v_arg2 (如:v_arg2:=800.20 即800小时零20分钟)

需要得到结果:v_arg1 - v_arg2 (即:99.50)即得到99小时零50分钟。
[/Quote]

declare
v1 number(10,2):=900.10;
v2 number(10,2):=800.20;
str varchar2(10);
str1 varchar2(10);
str2 varchar2(10);
begin
str1:=to_char(v1,'fm9999999.90');
str2:=to_char(v2,'fm9999999.90');
select trunc((trunc(v1)*60+substr(str1,instr(str1,'.')+1)-(trunc(v2)*60+substr(str2,instr(str2,'.')+1)))/60)||'.'
||mod(trunc(v1)*60+substr(str1,instr(str1,'.')+1)-(trunc(v2)*60+substr(str2,instr(str2,'.')+1)),60) into str from dual;
dbms_output.put_line(str);
end;



SQL> declare
2 v1 number(10,2):=900.10;
3 v2 number(10,2):=800.20;
4 str varchar2(10);
5 str1 varchar2(10);
6 str2 varchar2(10);
7 begin
8 str1:=to_char(v1,'fm9999999.90');
9 str2:=to_char(v2,'fm9999999.90');
10 select trunc((trunc(v1)*60+substr(str1,instr(str1,'.')+1)-(trunc(v2)*60+substr(str2,instr(str2,'.')+1)))/60)||'.'
11 ||mod(trunc(v1)*60+substr(str1,instr(str1,'.')+1)-(trunc(v2)*60+substr(str2,instr(str2,'.')+1)),60) into str from dual;
12 dbms_output.put_line(str);
13 end;
14 /

99.50

PL/SQL procedure successfully completed






coolkisses 2011-02-13
  • 打赏
  • 举报
回复
赞成分钟计算的方案
转换为分钟,计算完再转回原来的格式,这样最为简单。
kingkingzhu 2011-02-13
  • 打赏
  • 举报
回复
顶楼上 顺便 (900.10*60-800.20*60)/60 不能顶啊
xman_78tom 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qq646748739 的回复:]
这个是oracle语法吗?
[/Quote]
PLSQL 块,使用 interval 类型处理

用数学方法处理

1 declare
2 v1 number:=900.10;
3 v2 number:=800.20;
4 diff number;
5 begin
6 diff:=floor(v1)*60+(v1-floor(v1))*100-floor(v2)*60-(v2-floor(v2))*100;
7 diff:=floor(diff/60)+mod(diff,60)/100;
8 dbms_output.put_line(to_char(diff,'999999.00'));
9* end;
SQL> /
99.50

PL/SQL procedure successfully completed.

碧水幽幽泉 2011-02-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xman_78tom 的回复:]
SQL code

declare
v1 number:=900.10;
v2 number:=800.20;
ds interval day to second;
diff number(8,2);
begin
ds:=numtodsinterval(floor(v1),'hour')+numtodsinterval((v1-floor(v1))*100,'minute……
[/Quote]
这个是oracle语法吗?
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 java3344520 的回复:]
都转换成分钟,然后在转换为小时和分钟就可以了
(900.10*60-800.20*60)/60
[/Quote]
xman_78tom 2011-02-12
  • 打赏
  • 举报
回复

declare
v1 number:=900.10;
v2 number:=800.20;
ds interval day to second;
diff number(8,2);
begin
ds:=numtodsinterval(floor(v1),'hour')+numtodsinterval((v1-floor(v1))*100,'minute')-
numtodsinterval(floor(v2),'hour')-numtodsinterval((v2-floor(v2))*100,'minute');
diff:=extract(day from ds)*24+extract(hour from ds)+extract(minute from ds)/100;
dbms_output.put_line(to_char(diff,'99999.00'));
end;
/

minitoy 2011-02-12
  • 打赏
  • 举报
回复
可以简化一下
SELECT CASE
WHEN sign(MOD(900.10, 1) - MOD(800.20, 1)) >= 0 THEN
900.10 - 800.20
ELSE
900.10 - 800.20 - 0.4
END
FROM dual;
minitoy 2011-02-12
  • 打赏
  • 举报
回复
这样表示怪怪的.
实际上你的整数部分和小数部分不是一个数制.
iqlife 2011-02-12
  • 打赏
  • 举报
回复
都转换成分钟,然后在转换为小时和分钟就可以了
(900.10*60-800.20*60)/60

minitoy 2011-02-12
  • 打赏
  • 举报
回复
SQL> SELECT CASE
2 WHEN sign(MOD(900.10, 1) - MOD(800.20, 1)) >= 0 THEN
3 trunc(900.10) - trunc(800.20) + MOD(900.10, 1) - MOD(800.20, 1)
4 ELSE
5 trunc(900.10) - trunc(800.20) - 1 + 0.6 + MOD(900.10, 1) -
6 MOD(800.20, 1)
7 END
8 FROM dual;

CASEWHENSIGN(MOD(900.10,1)-MOD
------------------------------
99.5

SQL>
ks_reny 2011-02-12
  • 打赏
  • 举报
回复
你的参数会不会出现100.80 这代表什么意思?

17,134

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧