Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 从EventTime输入和退出SQLLite时间_Sqlite - Fatal编程技术网

Sqlite 从EventTime输入和退出SQLLite时间

Sqlite 从EventTime输入和退出SQLLite时间,sqlite,Sqlite,我有两个表,数据和事件,其中包含以下数据: EVENTS EventIndex ObjID LocID EventData EventTime EventType 83707365 3519434 10376 0 2013-05-19 11:32:11 137 83707849 3519434 10374 0 2013-05-19 11:35:18 137 83714233 888799 10376

我有两个表,数据和事件,其中包含以下数据:

EVENTS
EventIndex  ObjID   LocID   EventData   EventTime       EventType
83707365    3519434 10376   0           2013-05-19 11:32:11 137
83707849    3519434 10374   0           2013-05-19 11:35:18 137 
83714233    888799  10376   0           2013-05-19 12:24:45 137 
83715200    888799  10184   0           2013-05-19 12:32:18 137

DATA
EventIndex  TagName TagValue    
83714233    ObjName Peter
83714233    LocName H118
83715200    ObjName Peter
83715200    LocName H116
83707365    ObjName John
83707365    LocName H118
83707849    ObjName John
83707849    LocName H116
从哪里开始使用SQLLite查询

我想得到结果:

Name   Location  Entry      Exit        Total
Peter  H118      12:24:45   12:32:18    00:07:33
John   H118      11:32:11   11:35:18    00:03:07
Hi meewoK,可以给出以下情况:

姓名地点出入境合计 彼得H118 12:24:45 12:32:18 00:07:33 约翰H118 11:32:11 11:35:18 00:03:07 约翰H118 11:44:52 11:45:27 00:00:35 约翰H118 12:31:15 12:32:46 00:01:31

我正在尝试修改您的查询,但找不到解决方案。谢谢

此代码在SQL SERVER中工作:

选择E.EventIndex,N.tagvalue作为名称,L.tagvalue作为位置,E.eventtime作为条目,NEV[退出] 从…起 [事件]E E.EventIndex=N.EventIndex和N.tagname='ObjName'上的内部联接[DATA]N E.EventIndex=L.EventIndex和L.tagname='LocName'上的内部联接[DATA]L 外敷 选择TOP 1 NE.eventtime作为[退出] 从…起 [事件]NE NE.EventIndex=NL.EventIndex和NL.tagname='ObjName'上的内部联接[DATA]NL 哪里 NE.EventIndex>E.EventIndex 和NL.tagvalue=N.tagvalue 订购人 事件索引

) NEV  
其中L.tagvalue='H118'

有人能帮我把它传给SQLite吗?
谢谢

这里是一个用于处理表的快速SQL转储

CREATE TABLE EVENTS (EventIndex int, objID int, eventtime datetime);
INSERT INTO "EVENTS" VALUES(83707365,3519434,'2013-05-19 11:32:11');
INSERT INTO "EVENTS" VALUES(83707849,3519434,'2013-05-19 11:35:18');
INSERT INTO "EVENTS" VALUES(83714233,888799,'2013-05-19 12:24:25');
INSERT INTO "EVENTS" VALUES(83714233,888799,'2013-05-19 12:32:18');
CREATE TABLE DATA (eventindex int, tagname char, tagvalue char);
INSERT INTO "DATA" VALUES(83714233,'ObjName','Peter');
INSERT INTO "DATA" VALUES(83714233,'LocName','H118');
INSERT INTO "DATA" VALUES(83715200,'ObjName','Peter');
INSERT INTO "DATA" VALUES(83715200,'LocName','H118');
INSERT INTO "DATA" VALUES(83707365,'ObjName','John');
INSERT INTO "DATA" VALUES(83707849,'ObjName','John');
INSERT INTO "DATA" VALUES(83707365,'LocName','H118');
INSERT INTO "DATA" VALUES(83707849,'LocName','H118');
步骤1,获取每个对象的最大和最小事件类型:

现在,这揭示了数据结构的一些问题。对于每个对象,您有两个EventIndex,那么您应该选择哪一个?在这里,我只选择了其中最小的一个

步骤2,因为sqlite3不喜欢对聚合执行操作,所以我们将其放入一个视图中:

CREATE VIEW single_events AS 
SELECT ObjID, Min(EventIndex) as EventIndex, Min(EventTime) as Entry, Max(EventTime) as Exit FROM EVENTS GROUP BY ObjID;
步骤3,通过在视图上操作获取总时间:

SELECT *, time(strftime('%s', exit) - strftime('%s', entry), 'unixepoch') as total 
  FROM single_events;
ObjID       EventIndex  Entry                Exit                 total
----------  ----------  -------------------  -------------------  ----------
888799      83714233    2013-05-19 12:24:25  2013-05-19 12:32:18  00:07:53
3519434     83707365    2013-05-19 11:32:11  2013-05-19 11:35:18  00:03:07
第4步,将其与数据合并


当然,如果它是一个非常大的数据集,那么在运行步骤4之前将d1和d2放入一个临时表可能会对您有所帮助。

类似的内容可以让您很好地开始工作:

SQL Fiddle:

我添加了额外的事件,以防止退出一个事件被视为进入另一个事件

上述查询可以优化,如果我们说不能在不同的日期进行进入和退出,例如用户进入晚上11:59,离开凌晨1:00

SELECT d.TagValue AS Name,
       d2.TagValue AS LOCATION,
       e.eventTime AS Entry,

  ( SELECT eventtime
   FROM EVENTS e2
   WHERE e2.objID = e.objID
     AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
       (e.eventTime -
          ( SELECT eventtime
           FROM EVENTS e2
           WHERE e2.objID = e.objID
             AND e2.eventTime > e.eventTime AND
             DATE(e2.eventTime) = DATE(e.eventTime) LIMIT 1)) AS TotalTime
FROM events e,
     DATA d,
          DATA d2
WHERE e.eventIndex = d.eventIndex
  AND e.eventIndex = d2.eventIndex
  AND d.TagName = "ObjName"
  AND d2.TagName = "LocName"
  AND mod(
            ( SELECT count(*)
             FROM EVENTS e2
             WHERE e2.objID = e.objID
               AND e2.eventTime < e.eventTime AND
               DATE(e2.eventTime) = DATE(e.eventTime)),2) = 0
ORDER BY EventTime;

出入境记录有什么区别?事件表中没有此类信息。Hi CL,差异在表数据中。事件83714233在H118中定位Peter,事件83715200在H116中定位Peter,因此我们知道83715200是输出事件,如果我已经解释过的话。谢谢,请问哪种RDBMS和版本?EventIndex是否始终递增?是否确定eventType始终相同?另外,如果一个人有两个以上的活动,会发生什么?这些数字是每天的吗?那么H118是入口,H116是出口,LocName标签的任何其他内容都可以忽略?那么为什么输出中会有位置列呢?嗨,meewoK,谢谢。参观是否包括寻找入口和出口?我需要找到那些在H118地点有过一系列约会的人。这两个人能相隔多远?任何人相隔一天的两次点击之间会发生什么?在queryWell中显示它们,第一个查询跨日期工作。基本上,对一个阅读器的任何点击之后都必须对另一个阅读器进行另一次点击。如果有人连续多次打牌,就会出现问题。。。你需要更复杂的逻辑。顺便说一句,这让我想起了我以前见过的RFID。您是否有机会使用名为centaur的软件系统,该系统将连接到rfid阅读器的控制器的事件记录在MS SQL中?只是好奇…哦…如果您不关心特定查询的退出时间和只关心进入时间,那么逻辑就变得容易多了…SQLite3不支持mod函数(默认情况下)。请参阅@MrGumble,是的,这是来自合并问题,其中没有提到SQLLite。在任何情况下,我看到SQLLite支持%这是一样的。在算术下。我已经更新了代码,并使用sqlLite更新了fiddle::
SELECT d1.TagValue as Name, d2.TagValue as Location, Entry, Exit, time(strftime('%s', exit) - strftime('%s', entry), 'unixepoch') as total
  FROM single_events
  LEFT JOIN DATA as d1 USING (EventIndex)
  LEFT JOIN DATA as d2 USING (EventIndex)
  WHERE d1.tagname = 'ObjName' AND d2.tagname = 'LocName';
SELECT d.TagValue AS Name,
       d2.TagValue AS LOCATION,
       e.eventTime AS Entry,

  ( SELECT eventtime
   FROM EVENTS e2
   WHERE e2.objID = e.objID
     AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
       (e.eventTime -
          ( SELECT eventtime
           FROM EVENTS e2
           WHERE e2.objID = e.objID
             AND e2.eventTime > e.eventTime LIMIT 1)) AS TotalTime
FROM events e,
     DATA d,
          DATA d2
WHERE e.eventIndex = d.eventIndex
  AND e.eventIndex = d2.eventIndex
  AND d.TagName = "ObjName"
  AND d2.TagName = "LocName"
  AND mod(
            ( SELECT count(*)
             FROM EVENTS e2
             WHERE e2.objID = e.objID
               AND e2.eventTime < e.eventTime),2) = 0
ORDER BY EventTime;
NAME    LOCATION    ENTRY                   EXITTIME                  TOTALTIME
John    H118    May, 19 2013 11:32:11+0000  May, 19 2013 11:35:18+0000  -307
Peter   H118    May, 19 2013 12:24:45+0000  May, 19 2013 12:32:18+0000  -773
SELECT d.TagValue AS Name,
       d2.TagValue AS LOCATION,
       e.eventTime AS Entry,

  ( SELECT eventtime
   FROM EVENTS e2
   WHERE e2.objID = e.objID
     AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
       (e.eventTime -
          ( SELECT eventtime
           FROM EVENTS e2
           WHERE e2.objID = e.objID
             AND e2.eventTime > e.eventTime AND
             DATE(e2.eventTime) = DATE(e.eventTime) LIMIT 1)) AS TotalTime
FROM events e,
     DATA d,
          DATA d2
WHERE e.eventIndex = d.eventIndex
  AND e.eventIndex = d2.eventIndex
  AND d.TagName = "ObjName"
  AND d2.TagName = "LocName"
  AND mod(
            ( SELECT count(*)
             FROM EVENTS e2
             WHERE e2.objID = e.objID
               AND e2.eventTime < e.eventTime AND
               DATE(e2.eventTime) = DATE(e.eventTime)),2) = 0
ORDER BY EventTime;
SELECT d.TagValue AS Name,
       d2.TagValue AS LOCATION,
       e.eventTime AS Entry,

  ( SELECT eventtime
   FROM EVENTS e2
   WHERE e2.objID = e.objID
     AND e2.eventTime > e.eventTime LIMIT 1) AS ExitTime,
       (e.eventTime -
          ( SELECT eventtime
           FROM EVENTS e2
           WHERE e2.objID = e.objID
             AND e2.eventTime > e.eventTime LIMIT 1)) AS TotalTime
FROM events e,
     DATA d,
          DATA d2
WHERE e.eventIndex = d.eventIndex
  AND e.eventIndex = d2.eventIndex
  AND d.TagName = "ObjName"
  AND d2.TagName = "LocName"
  AND (
            ( SELECT count(*)
             FROM EVENTS e2
             WHERE e2.objID = e.objID
               AND e2.eventTime < e.eventTime)%2) = 0
ORDER BY EventTime;