使用时间戳计算总持续时间

时间:2020-10-26 08:13:41

标签: python sqlite

在我的SQLite表中,我具有以下字段(timestampzone_idobject_countobject_ids),这些是在区域中排队的人的数据。每当有人加入队列时,他就会被传感器捕获并被分配为object_idtimestamp是每秒从传感器服务器发送到数据库的数据。

我需要找到队列中每个object_ids的持续时间,以便使用Flask框架在我的Web应用程序中计算和显示等待时间。例如,object_ids(2166)在2020-10-19 17:03:46.000000进入队列,在2020-10-19 17:03:50.000000离开,他的队列时间为5秒。简单的逻辑是将object_id最后出现的时间戳减去object_id第一次出现的时间戳。

#       timestamp           zone_id   object_count      object_ids #  

2020-10-19 17:03:43.000000    10           2         ['2140', '2143']
2020-10-19 17:03:44.000000    10           2         ['2140', '2143']
2020-10-19 17:03:45.000000    10           2         ['2140', '2143']
2020-10-19 17:03:46.000000    10           3         ['2140', '2143', '2166']
2020-10-19 17:03:47.000000    10           3         ['2140', '2143', '2166']
2020-10-19 17:03:49.000000    10           3         ['2140', '2143', '2166']
2020-10-19 17:03:50.000000    10           3         ['2140', '2143', '2166']
2020-10-19 17:03:51.000000    10           2         ['2140', '2143']
2020-10-19 17:03:53.000000    10           2         ['2140', '2143']

如何查询和解决这个问题?

2 个答案:

答案 0 :(得分:0)

假设表的名称为queues,定义了object_id的表为objects(将名称更改为实际名称),那么您将具有以下内容:

CREATE table objects (`object_id` TEXT);
INSERT INTO objects (`object_id`) VALUES
  ('2140'), ('2143'), ('2166');

CREATE TABLE queues (`timestamp` TEXT, `zone_id` INTEGER, `object_count` INTEGER, `object_ids` VARCHAR(24));
INSERT INTO queues (`timestamp`, `zone_id`, `object_count`, `object_ids`) VALUES
  ('2020-10-19 17:03:43.000000', '10', '2', '[''2140'', ''2143'']'),
  ('2020-10-19 17:03:44.000000', '10', '2', '[''2140'', ''2143'']'),
  ('2020-10-19 17:03:45.000000', '10', '2', '[''2140'', ''2143'']'),
  ('2020-10-19 17:03:46.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
  ('2020-10-19 17:03:47.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
  ('2020-10-19 17:03:49.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
  ('2020-10-19 17:03:50.000000', '10', '3', '[''2140'', ''2143'', ''2166'']'),
  ('2020-10-19 17:03:51.000000', '10', '2', '[''2140'', ''2143'']'),
  ('2020-10-19 17:03:53.000000', '10', '2', '[''2140'', ''2143'']');

通过使用窗口函数MIN()MAX()和函数strftime(),可以通过连接两个表的SQLite查询获得所需的结果:

SELECT DISTINCT o.object_id,
       strftime('%s', MAX(q.timestamp) OVER (PARTITION BY o.object_id)) - 
       strftime('%s', MIN(q.timestamp) OVER (PARTITION BY o.object_id)) diff
FROM objects o INNER JOIN queues q
ON ',' || REPLACE(REPLACE(REPLACE(REPLACE(q.object_ids, '''', ''), '[', ''), ']', ''), ' ', '') || ','
LIKE '%,' || o.object_id || ',%'

如果您的SQLite版本不支持窗口函数,请使用GROUP BY

SELECT o.object_id,
       strftime('%s', MAX(q.timestamp)) - strftime('%s', MIN(q.timestamp)) diff
FROM objects o INNER JOIN queues q
ON ',' || REPLACE(REPLACE(REPLACE(REPLACE(q.object_ids, '''', ''), '[', ''), ']', ''), ' ', '') || ','
LIKE '%,' || o.object_id || ',%'
GROUP BY o.object_id

请参见demo
结果:

> object_id | diff
> :-------- | ---:
> 2140      |   10
> 2143      |   10
> 2166      |    4

答案 1 :(得分:-1)

因此,在application.py中,您应该具有以下代码才能获取正确的数据库,该代码应该位于文件中的某个位置,以便您所有的函数都可以访问它。

engine = create_engine(os.getenv("DATABASE_URL"))
db = scoped_session(sessionmaker(bind=engine))

然后在需要时间的函数中的某个地方,应该有类似的内容

timestamp = db.execute(text("SELECT timestamp FROM NAME_OF_YOUR_TABLE").fetchall()#this will get you all of the timestamps

现在您在python中的表中有了时间戳,因此您可以轻松地执行任何操作,可以轻松地将其转换为datetime格式,然后仅使用datetime.datetime.now()函数并将其减去彼此之间,如果您还有其他需要,请随时在下方留言。

编辑:因此,为了遍历ID列,您将需要以下内容:

T1 = db.execute(text("SELECT object_ids FROM NAME_OF_YOUR_TABLE")).fetchall()
for i in T1:
   
   timestamp = db.execute(text("SELECT timestamps FROM NAME_OF_YOUR_TABLE WHERE object_ids=:object_ids"), {'object_ids':i}).fetchone()
   print('Timestamp = ' + timestamp 'and id = ' + i)