如何找到两个时间戳列之间的差异

时间:2012-04-25 11:27:18

标签: oracle date-arithmetic

我的表名为Record,其中包含以下列,Empid在数字列中,dat在时间戳中

具有以下值

empid    dat
======   ====
101      4/9/2012 9:48:54 AM
101      4/9/2012 9:36:28 AM
101      4/9/2012 6:16:28 PM
101      4/10/2012 9:33:48 AM
101      4/10/2012 12:36:28 PM
101      4/10/2012 8:36:12 PM
101      4/11/2012 9:36:28 AM
101      4/11/2012 4:36:22 PM

这里我需要显示以下列

empidmin(dat)为开头,max(dat)为结束,difference(max(dat)-min(dat)为每天

此处存在3个不同的日期,因此应返回3条带有上述列的记录。

请提供一些方法来解决这个问题。

2 个答案:

答案 0 :(得分:2)

只需减去它们:max(dat) - min(dat)

SELECT empid,
       min(dat) as strt,
       max(dat) as end,
       max(dat) - min(dat) as diff
FROM the_table
GROUP BY empid;

如果您想按天而不是empid进行分组,请使用以下内容:

select trunc(dat),
       min(dat) as strt,
       max(dat) as end,
       max(dat) - min(dat) as diff       
from the_table
group by trunc(dat)

答案 1 :(得分:1)

Oracle中的日期算术非常简单:两个日期之间的差异将作为天数返回。小于一天的值将返回*小数“。也就是说,75分钟是1.25小时而不是1.15。如果您希望将其作为小时和分钟,则需要使用interval

内部查询计算每个员工每天的最小和最大数据之间的差异,并将其转换为DAY间隔。外部查询从该间隔中提取HOUR和MINUTES。

select empid
       , tday
       , sdt
       , edt
       , extract(hour from diff) diff_hours
       , extract (minute from diff) diff_minutes
from (
    select empid
           , trunc(dat) tday
           , min(dat) sdt
           , max(dat) edt
           , numtodsinterval(max(dat) - min(dat), 'DAY') diff
    from t42
    group by empid, trunc(dat)
)