ORACLE-SQL:如何计算数字类型中的2次?

时间:2018-08-03 08:55:48

标签: sql oracle time numbers

我将我的时间数据保留为数字类型(NUMBER(4,2)),我想计算如下列

2.15 (2:15 am.) - 1.45 (1:45 am)


***result***
0.30  (a half hour)

请给我解释一下计算方法。

6 个答案:

答案 0 :(得分:1)

尝试一下,我认为它将对您有用

select to_char(to_date(((to_date(to_char(09.15),'hh24.mi')-to_date(to_char(01.45),'hh24.mi'))*24*60*60),'sssss'),'hh24:mi') time from dual;

答案 1 :(得分:1)

尝试以下代码:

select (trunc(2.15)* 0.6 + (2.15 - trunc(2.15))) - (trunc(1.45)* 0.6 + (1.45 - trunc(1.45)))
    as result
  from YOUR_TABLE

结果:0,30

答案 2 :(得分:0)

假设您可以将它们分为不同的列:

with mins_calc as
(
select (floor(mytime1) - floor(mytime2))*60 + (mod(mytime1,1)-mod(mytime2,1)) as tot_mins
from Mytable
)
select to_char(floor(tot_mins/60))||'.'||to_char(mod(tot_mins,60)) as time_diff_char
from mins_calc

答案 3 :(得分:0)

转换为小时:

select ( trunc(t1) + (t1 - trunc(t1)) * 60) -
         trunc(t2) + (t2 - trunc(t2)) * 60)
       ) as hours

这会将时差转换为小数小时。我建议您不要这样,或转换为分钟。

答案 4 :(得分:0)

您可以将两个“时间”转换为分钟;它使用绑定变量来提供两个数值,因为不清楚从何处实际获取它们:

var time_1 number;
var time_2 number;
exec :time_1 := 2.15;
exec :time_2 := 1.45;

select 60 * trunc(:time_1) + 100 * (:time_1 - trunc(:time_1)) as minutes_1,
       60 * trunc(:time_2) + 100 * (:time_2 - trunc(:time_2)) as minutes_2,
      (60 * trunc(:time_1) + 100 * (:time_1 - trunc(:time_1)))
    - (60 * trunc(:time_2) + 100 * (:time_2 - trunc(:time_2))) as minutes_diff
from dual;

 MINUTES_1  MINUTES_2 MINUTES_DIFF
---------- ---------- ------------
       135        105           30

然后您可以通过逆转计算,将以分钟为单位的差异转换回所用(奇数)格式的数字;这会使用第二个CTE来获取上面计算的分钟数差异,以简化操作并避免重复长期操作:

with diff (minutes) as (
  select (60 * trunc(:time_1) + 100 * (:time_1 - trunc(:time_1)))
       - (60 * trunc(:time_2) + 100 * (:time_2 - trunc(:time_2)))
  from dual
)
select minutes,
       trunc(minutes/60) + mod(minutes, 60) / 100 as minutes_as_number
from diff;

   MINUTES MINUTES_AS_NUMBER
---------- -----------------
        30                .3

答案 5 :(得分:-1)

DATEDIFF(Transact-SQL)

此函数返回在指定的开始日期和结束日期之间相交的指定日期部分边界的计数(作为有符号整数值)。

//您可以返回:秒,分钟,天,年。您的情况是分钟。

SELECT DATEDIFF(分钟,'2018-08-03 02:15:00 am','2018-08-03 1:45:00 am');

返回值:-30

如果您希望像这样在varchar中获得精确的(30)转换。

SELECT CONVERT(varchar,ABS(DATEDIFF(minute,'2018-08-03 02:15:00 am','2018-08-03 1:45:00 am')))); < / em>

首先使用ABS()获取绝对数(除去(-)减号信号),然后使用CONVERT()转换为varchar。

来源: https://docs.microsoft.com/zh-cn/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017

ORACLE版本
SELECT TO_DATE('2000-01-02','YYYY-MM-DD')-TO_DATE('2000-01-01','YYYY-MM-DD')AS DateDiff FROM double < / p>