Привет, у меня есть такой результат из моего запроса.
Изображение результата запроса
, и я хочу получить разницу в указанном разрыве 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