2016-09-22 3 views
0
SELECT 
    OUT.EMP_ID, 
    OUT.DT_TM "DateTimeOut", 
    IN.DT_TM "DateTimeIn", 
    cast(timestampdiff(4, char(timestamp(IN.DT_TM) - timestamp(OUT.DT_TM))) as decimal(30,1))/60 "Duration Out" 
FROM ( 
    select 
    e1.EMP_ID, 
    e1.DT_TM  
    from 
    hr.timeout e1 
    WHERE  
    month(e1.DT_TM)=09 
    and year(e1.DT_TM)=2016 
    AND e1.CD='OUT' 
) OUT 
LEFT JOIN ( 
    select 
    e2.EMP_ID, 
    e2.DT_TM 
    from 
    hr.timeout e2 
    WHERE  
    month(e2.dt_tm)=09 
    and year(e2.dt_tm)=2016 
    AND e2.CD='IN' 
) IN 
on out.EMP_ID=in.EMP_ID 

と一致するようにしようとするとDateTimeOutと一致します。 現在は同じDateTimeOutDateTimeInを複数回繰り返します。時間差を得るために開始日を最も近い終了日に一致させる方法

+0

サンプルデータと予想される結果を表示したい場合があります。 – mustaccio

+0

order by(datetimein - datetimeout)descまたはそのようなもの... – danny117

答えて

0

あなたのテーブルはemp_id、dt_tm、およびcdに一意の制約がないので、私はその通常のことと思います。

With Period as (
    select e1.EMP_ID, e1.DT_TM from hr.timeout e1 
    WHERE month(e1.DT_TM)=09 and year(e1.DT_TM)=2016 
    ) 
    Select distinct OUT.EMP_ID, IN.DT_TM as DateTimeIn, OUT.DT_TM as DateTimeOut, 
    TIMESTAMPDIFF(2 , CAST(timestamp(IN.DT_TM) - timestamp(ifnull(OUT.DT_TM, current date)) AS CHAR(22))) as DurationSecond 
    from Period in left outer join Period out 
    on out.EMP_ID=in.EMP_ID and out.CD='OUT' and in.CD='IN' 
    order by 1, 2, 3 

あなたが見ることができるように、私はあなたが左の外側を行う参加ので、私はIFNULLを使用し、第二のための最初のパラメータ(あなたが60で割った値)のように「2」とTIMESTAMPDIFFを使用します。しかし、あなたがしたい場合は独自の結果は、この試します(out.DT_TMはヌルにすることができます)、ユニークな結果のためには別のものを使用します

関連する問題