如何在oracle 10中的SELECT中生成TIMESTAMP和DATE之间的diff

时间:2016-08-23 12:21:52

标签: oracle date select timestamp

我需要查询2个表,一个包含TIMESTAMP(6)列,另一个包含DATE列。我想编写一个select语句,在第三列中打印这两个值和差异。

SB_BATCH.B_CREATE_DT - 时间戳 SB_MESSAGE.M_START_TIME - 日期

def reg = ~/^groovy/   //Match 'groovy' if it is at the beginning of the String
String str = 'library-groovy' - reg

println(str)

结果:

cp `ls -t | head -1` final.csv

2 个答案:

答案 0 :(得分:1)

您可以减去两个时间戳来获得INTERVAL DAY TO SECOND,从中计算两个时间戳之间经过的时间。要将SB_MESSAGE.M_START_TIME转换为时间戳,您可以使用CAST

请注意,我还使用显式INNER JOIN删除了隐式表连接,将连接条件移动到ON子句。

SELECT t.B_UID,
       t.B_CREATE_DT,
       t.M_START_TIME, 
       EXTRACT(DAY FROM t.diff)*24*60 +
       EXTRACT(HOUR FROM t.diff)*60 +
       EXTRACT(MINUTE FROM t.diff) +
       ROUND(EXTRACT(SECOND FROM t.diff) / 60.0) AS diff_in_minutes
FROM
(
    SELECT SB_BATCH.B_UID,
           SB_BATCH.B_CREATE_DT,
           SB_MESSAGE.M_START_TIME, 
           SB_BATCH.B_CREATE_DT - CAST(SB_MESSAGE.M_START_TIME AS TIMESTAMP) AS diff
    FROM SB_BATCH
    INNER JOIN SB_MESSAGE
        ON SB_BATCH.B_UID = SB_MESSAGE.M_B_UID
) t

答案 1 :(得分:0)

使用cast(... as date)将时间戳转换为日期。然后取日期之间的差异,这是一个数字 - 用天表示,所以如果你想要它在几分钟内,乘以24 * 60。然后根据需要舍入结果。我在下面编写了一个小例子,仅仅分析了回答问题所需的步骤。 (请注意,您的查询还有许多其他问题,例如您实际上并未对任何地方产生任何影响。如果您一般需要查询帮助,请将其作为单独的问题发布。)

select ts, dt, round( (sysdate - cast(ts as date))*24*60, 2) as time_diff_in_minutes
from (select to_timestamp('2016-08-23 03:22:44.734000', 'yyyy-mm-dd hh24:mi:ss.ff') as ts, 
      sysdate  as dt from dual )
;

TS                               DT                  TIME_DIFF_IN_MINUTES
-------------------------------- ------------------- --------------------
2016-08-23 03:22:44.734000000    2016-08-23 08:09:15               286.52