2016-02-17 65 views
0

我想要想出一种方法来计算两个日期之间在几小时和几分钟之间的差异。以小时和分钟查找两个日期之间的差异

我有两列Start DateTimeStamp表:

Start Date    Timestamp 
-------------------- -------------------- 
05/JAN/2016 05:30:00 01/JAN/2016 10:02:29 
30/JAN/2016 06:10:00 18/JAN/2016 19:24:00 
23/JAN/2016 06:10:00 08/JAN/2016 10:46:00 
05/JAN/2016 05:30:00 30/DEC/2015 16:07:00 
23/JAN/2016 06:10:00 08/JAN/2016 12:18:05 
01/JAN/2016 14:10:00 16/DEC/2015 16:36:56 
01/JAN/2016 14:10:00 16/DEC/2015 11:41:00 
03/JAN/2016 05:15:00 02/JAN/2016 11:23:15 
03/JAN/2016 05:15:00 02/JAN/2016 07:52:00 

我使用查询:

select ROUND(RM_LIVE.CRWGNDACTTIME.GNDACTSTARTRM_LIVE.TRANSACTIONLOG.TIMESTAMP,2) 
         AS "Difference" 
    from Transaction; 

查询结果是:

0.002721428571428571428571428571428571428571 
0.008178571428571428571428571428571428571429 
0.0105785714285714285714285714285714285714 
0.003971428571428571428571428571428571428571 

预期结果:

133:23 
91:28 
355:24 
353:52 
274:46 

我在使用这个公式Excel中预期的结果:

= MAX(T982+U982,W982+V982) - MIN(T982+U982,W982+V982) 

我怎样才能用Oracle SQL相同的结果?

CASE 
    WHEN trunc(24 * abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
- RM_LIVE.CRWGNDACTTIME.GNDACTSTART)) 
    ||':'|| lpad(round(60 * mod(24 * abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
- RM_LIVE.CRWGNDACTTIME.GNDACTSTART), 1)), 2, '0') <= '11:00' THEN  'LESS' 
ELSE 'MORE' 
END AS "mORE/LESS", 


386:29 1055 01-JAN-16 16-DEC-15 MORE 
**102:41 1055 08-NOV-15 04-NOV-15 LESS** 
381:33 1055 01-JAN-16 16-DEC-15 MORE 
176:45 1055 20-NOV-15 12-NOV-15 MORE 
**119:54 1055 08-NOV-15 03-NOV-15 LESS** 
+0

我检查,但没有西隧我那里寻找只是天不以小时 –

+0

他询问结果在24小时内和IM在时间要求差的两个日期,以便有两种不同的东西 –

+0

为什么他们有什么不同?您的第一排'05/JAN/2016 05:30:00 01/1/2016 10:02:29',差异为3天,19小时,27分30秒; 3天是72小时,所以总共是91小时。对该链接问题的查询给出了91:27:30。对于你的第四个价值,它给出了133:22。你可以放弃秒部分? –

回答

2

我已经展示在this answer解释一对夫妇的变化,但它似乎是做的比你想稍微多 - 你不希望看到的秒 - 并且不允许超过100个小时。

得到你想要的输出最简单的方法是:

trunc(24 * (RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP)) 
    ||':'|| lpad(round(60 * mod(24 * (RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP), 1)), 2, '0') 
as difference 

第一部分获得了整个的小时数,这是类似于您在评论中添加一个方法,但不是截断四舍五入只能得到整个小时。然后是一个冒号分隔符。然后通过从小时计算中获得剩余时间来计算分钟数 - 通过mod()这是小时数,并将其乘以60. lpad()在分钟数上增加了前导零,但您可以使用to_char()代替。

如果您有多个范围的组合,其中时间戳可能在开始时间之前或之后,那么您可以使用the abs() function总是获得肯定的结果。

trunc(24 * abs(RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP)) 
    ||':'|| lpad(round(60 * mod(24 * abs(RM_LIVE.CRWGNDACTTIME.GNDACTSTART 
    - RM_LIVE.TRANSACTIONLOG.TIMESTAMP), 1)), 2, '0') 
as difference 

与单个表中嘲笑你的数据演示:

create table your_table(id, start_time, timestamp) as 
    select 1, to_date ('05/JAN/2016 05:30:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('01/JAN/2016 10:02:29', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 2, to_date ('30/JAN/2016 06:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('18/JAN/2016 19:24:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 3, to_date ('23/JAN/2016 06:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('08/JAN/2016 10:46:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 4, to_date ('05/JAN/2016 05:30:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('30/DEC/2015 16:07:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 5, to_date ('23/JAN/2016 06:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('08/JAN/2016 12:18:05', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 6, to_date ('01/JAN/2016 14:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/DEC/2015 16:36:56', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 7, to_date ('01/JAN/2016 14:10:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/DEC/2015 11:41:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 8, to_date ('03/JAN/2016 05:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('02/JAN/2016 11:23:15', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 9, to_date ('03/JAN/2016 05:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('02/JAN/2016 07:52:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 10, to_date ('16/JAN/2016 11:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/JAN/2016 12:44:00', 'DD/MON/YYYY HH24:MI:SS') from dual 
    union all select 11, to_date ('16/JAN/2016 11:15:00', 'DD/MON/YYYY HH24:MI:SS'), to_date('16/JAN/2016 12:50:00', 'DD/MON/YYYY HH24:MI:SS') from dual; 

等效查询:

select start_time, timestamp, trunc(24 * abs(start_time - timestamp)) 
    ||':'|| lpad(round(60 * mod(24 * abs(start_time - timestamp), 1)), 2, '0') 
    as difference 
from your_table 
order by id; 

START_TIME   TIMESTAMP   DIFFERENCE 
------------------- ------------------- ---------- 
2016-01-05 05:30:00 2016-01-01 10:02:29 91:28  
2016-01-30 06:10:00 2016-01-18 19:24:00 274:46  
2016-01-23 06:10:00 2016-01-08 10:46:00 355:24  
2016-01-05 05:30:00 2015-12-30 16:07:00 133:23  
2016-01-23 06:10:00 2016-01-08 12:18:05 353:52  
2016-01-01 14:10:00 2015-12-16 16:36:56 381:33  
2016-01-01 14:10:00 2015-12-16 11:41:00 386:29  
2016-01-03 05:15:00 2016-01-02 11:23:15 17:52  
2016-01-03 05:15:00 2016-01-02 07:52:00 21:23  
2016-01-16 11:15:00 2016-01-16 12:44:00 1:29  
2016-01-16 11:15:00 2016-01-16 12:50:00 1:35  

你不能简单的比较字符串值你想要的 - 它必须是一个像91:28这样的值的字符串 - 与其他任何东西,因为数字的字符串比较不好。如你所见,比较'119:54'和'11:00'可以有效地比较每个字符串的第三个字符,因为前两个字符相同,所以9:

这将是简单的把它作为一个小数比较:

CASE 
    WHEN round(24 * abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
    - RM_LIVE.CRWGNDACTTIME.GNDACTSTART), 2) <= 11 THEN 'LESS" 
ELSE 'MORE' 
END AS "mORE/LESS", 

为91:28例如,将比较小数版本91.46代替; 119:54比119.9,超过11; 102:41进行比较,102.68,这也超过11

或者你可以通过将固定值通过24(小时在一天),而不是相乘的时间差略微简化它:

CASE 
    WHEN abs(RM_LIVE.TRANSACTIONLOG.TIMESTAMP 
    - RM_LIVE.CRWGNDACTTIME.GNDACTSTART) <= 11/24 THEN 'LESS" 
ELSE 'MORE' 
END AS "mORE/LESS", 
+0

在大多数再编码器的即时通讯geeting此 -1:-2 -1:-3 如果日期是这样 16/JAN/2016 11时15分00秒16 \t/JAN/2016年12时44分零零秒 16/JAN/2016 11:15:00 \t 16/JAN/2016 12点50个00秒 –

+0

精湛非常感谢... –

+0

一件事的差值结果来为文本我如何能转换成数字或时间 –

相关问题