[Решено] Разница двух последовательных строк - PullRequest
0 голосов
/ 04 февраля 2020

Привет, у меня есть такой результат из моего запроса.

Изображение результата запроса

, и я хочу получить разницу в указанном разрыве epmloyee c время, поэтому мне нужно минус время (OUT-IN).

У меня есть поиск net, но я не вижу ничего, связанного с моей проблемой.

пример данных ниже, чтобы сделать вещи лучше .

ID  Date-TIme           Log-Type
1   2020-02-03 01:52:01   IN
2   2020-02-03 02:00:50   OUT
3   2020-02-03 03:12:14   IN
4   2020-02-03 03:48:55   OUT
5   2020-02-03 05:22:00   OUT
6   2020-02-03 21:59:52   IN
7   2020-02-03 21:59:57   IN
8   2020-02-03 22:20:21   OUT

ожидаемый результат.

ID  Date-TIme           Log-Type       RESULT
1   2020-02-03 01:52:01   IN
2   2020-02-03 02:00:50   OUT
3   2020-02-03 03:12:14   IN           1:12
4   2020-02-03 03:48:55   OUT
5   2020-02-03 05:22:00   OUT
6   2020-02-03 21:59:52   IN           5:38
7   2020-02-03 21:59:57   IN
8   2020-02-03 22:20:21   OUT

Мой запрос на получение результата.

  SELECT L.NEVENTLOGIDN, LPAD (nuserid, 6, '0') nuserid, u.susername, 
    TO_CHAR (TO_DATE ('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') + ( (ndatetime) / (60 * 60 * 24)), 'YYYY-MM-DD HH24:MI:SS') 
    date_time, l.nreaderidn, r.sname, 
    CASE WHEN l.nreaderidn IN (SELECT nreaderidn FROM tb_reader where sdescription in(Select Distinct SDESCRIPTION from TB_READER where SDESCRIPTION is not null and SDESCRIPTION not Like '%IN%' and SDESCRIPTION not like '%OUT%') and upper(sname) like '%' || upper('OUT') || '%') THEN 'OUT' 
    WHEN l.nreaderidn  IN (SELECT nreaderidn FROM tb_reader where sdescription in(Select Distinct SDESCRIPTION from TB_READER where SDESCRIPTION is not null and SDESCRIPTION not Like '%IN%' and SDESCRIPTION not like '%OUT%') and upper(sname) like '%' || upper('IN') || '%') THEN 'IN' END logtype 
   FROM TB_EVENT_LOG l, TB_READER r, TB_USER u 
   WHERE 
   l.nreaderidn IN (SELECT nreaderidn FROM tb_reader where sdescription in(Select Distinct SDESCRIPTION from TB_READER where SDESCRIPTION is not null and SDESCRIPTION not Like '%IN%' and SDESCRIPTION not like '%OUT%')) 
   AND NDATETIME >= (trunc(sysdate -1) - TO_DATE ('1970-01-01 12:00:00 AM', 'YYYY-MM-DD HH:MI:SS AM')) * 24 * 60 * 60 
   AND ndatetime <= (trunc(sysdate) - TO_DATE ('1970-01-01 12:00:00 AM', 'YYYY-MM-DD HH:MI:SS AM')) * 24 * 60 * 60 
   AND l.nuserid = u.suserid 
   AND l.nreaderidn = r.nreaderidn                           
   ORDER BY 2, 4;

В данных нормально иметь последовательный IN или OUT в этом случае мне нужно получить последнюю версию. вот моя попытка.

SELECT L.NEVENTLOGIDN, nuserid, u.susername, 
    TO_CHAR (TO_DATE ('1970-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') + ( (ndatetime) / (60 * 60 * 24)), 'YYYY-MM-DD HH24:MI:SS') 
    date_time, l.nreaderidn,R.SDESCRIPTION , r.sname, 
    CASE WHEN l.nreaderidn IN (SELECT nreaderidn FROM tb_reader where sdescription in(Select Distinct SDESCRIPTION from TB_READER where SDESCRIPTION is not null and SDESCRIPTION not Like '%IN%' and SDESCRIPTION not like '%OUT%') and upper(sname) like '%' || upper('OUT') || '%') THEN 'OUT' 
    WHEN l.nreaderidn  IN (SELECT nreaderidn FROM tb_reader where sdescription in(Select Distinct SDESCRIPTION from TB_READER where SDESCRIPTION is not null and SDESCRIPTION not Like '%IN%' and SDESCRIPTION not like '%OUT%') and upper(sname) like '%' || upper('IN') || '%') THEN 'IN' END logtype ,
    CASE WHEN log_type = 'IN' AND LAG(log_type) OVER (PARTITION BY employee ORDER BY date_time) = 'OUT' THEN DATEDIFF(date_time, LAG(date_time) OVER (PARTITION BY employee ORDER BY date_time)) ELSE NULL END remarks
   FROM TB_EVENT_LOG l, TB_READER r, TB_USER u 
   WHERE 
   l.nreaderidn IN (SELECT nreaderidn FROM tb_reader where sdescription in(Select Distinct SDESCRIPTION from TB_READER where SDESCRIPTION is not null and SDESCRIPTION not Like '%IN%' and SDESCRIPTION not like '%OUT%')) 
   AND NDATETIME >=  (trunc(sysdate -1) - TO_DATE ('1970-01-01 12:00:00 AM', 'YYYY-MM-DD HH:MI:SS AM')) * 24 * 60 * 60 
   AND ndatetime <=  (trunc(sysdate) - TO_DATE ('1970-01-01 12:00:00 AM', 'YYYY-MM-DD HH:MI:SS AM')) * 24 * 60 * 60 
   AND l.nuserid = u.suserid 
   AND l.nreaderidn = r.nreaderidn                           
   ORDER BY 2, 4;

это дает ошибку ORA-00904: "DATEDIFF": invalid identifier Надеюсь, кто-нибудь поможет мне с этим. Заранее спасибо

ОБНОВЛЕНИЕ Обновить Я вставляю результат моего оператора select в таблицу с именем TB_IN_OUT, теперь мой запрос выглядит следующим образом.

    Select USERID,USERNAME,READERNAME,DATE_TIME,LOGTYPE,
   CASE WHEN LOGTYPE = 'IN' AND LAG(LOGTYPE) OVER (PARTITION BY USERNAME ORDER BY DATE_TIME) = 'OUT' THEN 
   LAG(to_Date(DATE_TIME)) OVER (PARTITION BY DATE_TIME ORDER BY DATE_TIME) - to_date(DATE_TIME)

    ELSE NULL END
    from TB_IN_OUT 

, но возвращает ошибку из

literal does not match format string

ОБНОВЛЕНИЕ

Select t.*,

        CASE WHEN LOGTYPE = 'IN' AND LAG(LOGTYPE) OVER (PARTITION BY USERNAME ORDER BY DATE_TIME) = 'OUT' THEN 

             --Round( (to_date(DATE_TIME,'YYYY-MM-DD HH24:MI:SS ') - to_date(LAG(DATE_TIME) OVER (PARTITION BY USERNAME ORDER BY DATE_TIME),'YYYY-MM-DD HH24:MI:SS ')) * 24,1)
             (to_date(DATE_TIME,'YYYY-MM-DD HH24:MI:SS ') - to_date(LAG(DATE_TIME) OVER (PARTITION BY USERNAME ORDER BY DATE_TIME),'YYYY-MM-DD HH24:MI:SS ')) * 24

       end as result

From TB_IN_OUT t
 where t.DATE_TIME like '%2020-01-31%'

результат разницы между датой и подобным.

5.43333333333333 
0.0536111111111111
2.60583333333333

ожидаемый результат.

05:26:00
00:03:13
02:36:21

1 Ответ

1 голос
/ 04 февраля 2020

Если ваши данные выглядят так, как в примере данных, вам просто нужно использовать функцию задержки следующим образом:

Select t.*,
       Case when lag(log_type) over (partition by username, trunc(datetime) order by datetime) = 'OUT' 
                 and logtype = 'IN' 
            then to_char(trunc(sysdate) + (datetime - lag(datetime) over (partition by username, trunc(datetime) order by datetime)),'hh24:mi') 
       end as result
From your_table t

Пожалуйста, рассмотрите возможность изменения типа данных дата-время на дату с помощью to_date

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...