-1

次の列を持つテーブル名レコードがあります。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 つのレコードが返されます。

これを取得する方法をいくつか教えてください。

4

2 に答える 2

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)
于 2012-04-25T11:30:00.753 に答える
1

Oracle では、日付の計算は非常に簡単です。2 つの日付の差が日数として返されます。1 日未満の値は *decimals として返されます。つまり、75 分は 1.15 時間ではなく 1.25 時間です。時間と分として使用する場合は、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)
)
于 2012-05-02T10:53:03.007 に答える