我需要查询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
答案 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