【发布时间】:2013-10-31 17:33:21
【问题描述】:
想象一下有锁门的房间。门口有读卡器。要打开门,您需要将卡放入读卡器。
我的 Oracle 数据库中有 2 个包含事件的表 - 入口(门是从房间外面打开的) 出口(门是从房间里打开的)
我想要的只是选择存在间隔,例如 员工 1 在某天从 10:00 到 11:00 以及从 12:00 到 18:00 在房间里。
但是有3个问题
- 有时用户打开门但不离开房间。
- 有时一个用户打开门,另一个用户和他一起出去,而 门被打开了一次。
- 数据大小(每张表约100k)
还有问题:
- 选择存在间隔的最佳方法是什么
- 有没有办法创建快速可刷新的物化视图来解决这个问题?
这里是示例
drop table entries;
drop table exits;
CREATE TABLE ENTRIES
(
"EVENTDATE" DATE NOT NULL,
"EVENTTIME" DATE NOT NULL,
"EMPLOYEEID" NUMBER NOT NULL
);
CREATE TABLE EXITS
(
"EVENTDATE" DATE NOT NULL,
"EVENTTIME" DATE NOT NULL,
"EMPLOYEEID" NUMBER NOT NULL
);
delete from ENTRIES;
delete from exits;
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 08:44:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:18:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:19:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:22:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:37:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:38:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:39:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:40:00','DD-MON-RR HH24:MI:SS'));
Insert into ENTRIES (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 13:22:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:40:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 12:36:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 11:55:00','DD-MON-RR HH24:MI:SS'));
Insert into EXITS (EMPLOYEEID,EVENTDATE,EVENTTIME) values (8,to_date('01-AUG-13 00:00:00','DD-MON-RR HH24:MI:SS'),to_date('01-JAN-00 18:02:00','DD-MON-RR HH24:MI:SS'));
想要的结果是这样的:
"EMPLOYEID" "EVENTDATE" "ENTERTIME" "LEAVETIME"
8 01-AUG-13 00:00:00 01-JAN-00 08:44:00 01-JAN-00 11:55:00
8 01-AUG-13 00:00:00 01-JAN-00 12:18:00 01-JAN-00 12:36:00
8 01-AUG-13 00:00:00 01-JAN-00 12:37:00 01-JAN-00 12:40:00
8 01-AUG-13 00:00:00 01-JAN-00 13:22:00 01-JAN-00 18:02:00
更新
如果连续有 2 个输入,请先使用,然后忽略第二个。 如果连续有 2 个出口,则使用第二个,先忽略
【问题讨论】:
-
您要实现哪些业务规则?如果用户打开门但没有退出,您如何确定他们何时真正退出?如果用户关注某人,您如何确定?如果您看到用户输入了时间 A 并在时间 B 再次输入,您如何确定第一个时间间隔何时结束(假设用户与其他人一起退出)?如果您看到用户在 A 处进入、在 B 处退出并在 C 处退出,您是否认为他们只是出现在 A 和 B 之间?你怎么知道他们是不走就开门还是和别人一起进来的?
-
检查我提供的样本。这是相当描述性的。简而言之,如果连续有 2 个输入,则首先使用,然后忽略第二个。如果连续有 2 个出口,则使用第二个,请先忽略
-
日期和时间没有存储在同一字段中的任何原因?
-
启用不同日期的轻松时间过滤。有没有其他方法可以轻松实现?
标签: sql performance oracle date materialized-views