有一个检查站。检查点记录该通行证,并在下表中记录该通行证的记录
CREATE TABLE tabel_tabel (
ID NUMBER,
DATE_LOG DATE,
DATE_LOG_TRUNC DATE,
WORKER_ID NUMBER,
ACCESS_STATUS NUMBER(1)
);
按照以下格式
INSERT ALL
-- первый день, затуп считывания в начале дня
INTO tabel_tabel (ID, DATE_LOG, DATE_LOG_TRUNC,WORKER_ID,ACCESS_STATUS)
VALUES (1, TO_DATE('01.09.2023 7:49:55', 'DD.MM.YYYY HH24:MI:SS'), TO_DATE('01.09.2023', 'DD.MM.YYYY'), 123, 0)
INTO tabel_tabel (ID, DATE_LOG, DATE_LOG_TRUNC,WORKER_ID,ACCESS_STATUS)
VALUES (2, TO_DATE('01.09.2023 7:50:00', 'DD.MM.YYYY HH24:MI:SS'), TO_DATE('01.09.2023', 'DD.MM.YYYY'), 123, 0)
INTO tabel_tabel (ID, DATE_LOG, DATE_LOG_TRUNC,WORKER_ID,ACCESS_STATUS)
VALUES (3, TO_DATE('01.09.2023 17:01:00', 'DD.MM.YYYY HH24:MI:SS'), TO_DATE('01.09.2023', 'DD.MM.YYYY'), 123, 1)
-- второй день, затуп считывания в конце дня
INTO tabel_tabel (ID, DATE_LOG, DATE_LOG_TRUNC,WORKER_ID,ACCESS_STATUS)
VALUES (4, TO_DATE('02.09.2023 7:55:00', 'DD.MM.YYYY HH24:MI:SS'), TO_DATE('02.09.2023', 'DD.MM.YYYY'), 123, 0)
INTO tabel_tabel (ID, DATE_LOG, DATE_LOG_TRUNC,WORKER_ID,ACCESS_STATUS)
VALUES (5, TO_DATE('02.09.2023 17:00:30', 'DD.MM.YYYY HH24:MI:SS'), TO_DATE('02.09.2023', 'DD.MM.YYYY'), 123, 1)
INTO tabel_tabel (ID, DATE_LOG, DATE_LOG_TRUNC,WORKER_ID,ACCESS_STATUS)
VALUES (6, TO_DATE('02.09.2023 17:01:00', 'DD.MM.YYYY HH24:MI:SS'), TO_DATE('02.09.2023', 'DD.MM.YYYY'), 123, 1)
SELECT * FROM dual;
有时检查站的软件可能很愚蠢,会多次读取通行证。
在实际示例中,数据量要多得多,因此按WORKER_ID
日期范围进行采样
select t.id,
TO_CHAR(t.DATE_LOG, 'DD.MM.YYYY HH24:MI:SS') as date_log,
t.date_log_trunc,
t.worker_id,
t.access_status
from tabel_tabel t
where t.date_log_trunc >= TO_DATE('01.09.2023', 'DD.MM.YYYY')
AND t.date_log_trunc <= SYSDATE
AND t.worker_id = 123
查询结果如下所示
ID DATE_LOG DATE_LOG_TRUNC WORKER_ID ACCESS_STATUS
1 01.09.2023 07:49:55 01-SEP-23 123 0
2 01.09.2023 07:50:00 01-SEP-23 123 0
3 01.09.2023 17:01:00 01-SEP-23 123 1
4 02.09.2023 07:55:00 02-SEP-23 123 0
5 02.09.2023 17:00:30 02-SEP-23 123 1
6 02.09.2023 17:01:00 02-SEP-23 123 1
有必要将其采用这样的格式:在日期上WORKER_ID
形成两个字段ACCESS_STATUS
(0 - 进入,1 - 退出),其中包含最小进入日期和最大退出日期的值,即
DATE_LOG_TRUNC TIME_IN TIME_OUT WORKER_ID
01.09.2023 07:49:55 17:01:00 123
02.09.2023 07:55:00 17:01:00 123
这是根据指定条件对数据进行分组的方法:
显示员工每天的最短入职日期和最长离职日期