【问题标题】:SQL Query to generate for visitor InTime visitor OutTime and visit duration( time difference) from sql table having timestamp and visitor id从具有时间戳和访问者 ID 的 sql 表中为访问者 InTime 访问者 OutTime 和访问持续时间(时间差)生成 SQL 查询
【发布时间】:2019-12-30 02:57:31
【问题描述】:

MySQL 服务器上的访问者数据库如下所示 id是主键整数类型,firstnamelastname是文本类型,visitor id是整数类型

id  firstname       lastname    visitorid
1   userfirstname1      userlastname1   1
2   userfirstname2      userlastname2   2
3   userfirstname3      userlastname3   3
4   userfirstname4      userlastname4   4
5   userfirstname5      userlastname5   5

访问数据库 MySQL 服务器如下所示 id 是主键整数类型,时间是 DateTime 类型,visitorid_id 是访问者表的外键(visitor->visitorid) id时间visitorid_id

id  scantime                visitorid_id    
433 2019-12-25 09:00:00.000000      1   
434 2019-12-25 18:00:00.000000      1   
435 2019-12-26 09:00:00.000000      1   
436 2019-12-26 18:00:00.000000      1   
437 2019-12-27 09:00:00.000000      1   
438 2019-12-27 18:00:00.000000      1   
439 2019-12-28 09:00:00.000000      1   
440 2019-12-28 18:00:00.000000      1   
441 2019-12-29 09:00:00.000000      1   
442 2019-12-29 18:00:00.000000      1   
443 2019-12-25 10:00:00.000000      2   
444 2019-12-25 17:00:00.000000      2   
445 2019-12-25 09:30:00.000000      3   
446 2019-12-25 17:30:00.000000      3   
447 2019-12-25 08:00:00.000000      5   
448 2019-12-25 18:00:00.000000      5   
449 2019-12-25 11:30:00.000000      4   
450 2019-12-25 17:30:00.000000      4

我需要从我的表格上方生成显示以下数据的报告

日期、访客名字、访客姓氏、第一次扫描时间、第二次扫描时间、第一次扫描和第二次扫描时间之间的时间差,格式为 HH:MM:SS。

我使用了以下链接,但无法获得生成所需报告的正确 SQL 查询 一)How to concatenate text from multiple rows into a single text string in SQL server? b) Calculate the time difference between two timestamps in mysql

什么是优化查询以生成大量所需的报告。记录。

【问题讨论】:

  • 你需要解释一下什么是“第一次扫描时间,第二次扫描时间”..
  • 说明中提到的第1次扫描时间、第2次扫描时间如下。当访客通过检查点时,它的第一次通过称为第一次扫描时间,当访客第二次通过时称为第二次扫描时间,当访客第三次通过时称为第三次扫描时间,依此类推。访客可以多次通过检查站。第一次扫描时间是最旧的,后来的扫描时间是较新的。希望这能澄清您的疑问

标签: mysql sql


【解决方案1】:

此解决方案 San 将为您提供我的 POV 所需的一切。我的理解是你想要前两次访问。对于差异,我以秒为单位表示。您可以转换为 HH:MM:SS。 我没有 Date 列,因为我不知道你想要什么。

;with firstvisit as
(
select visitorid_id, min(scantime) as firstscan from visits a group by visitorid_id
)
select a.visitorid_id, firstname, lastname, a.firstscan, b.scantime as secundscan, TIMESTAMPDIFF(SECOND, b.scantime, a.firstscan) from firstvisit a 
inner join visitors v on v.visitorid = a.visitorid_id
inner join visits b on  a.visitorid_id = b.visitorid_id and b.scantime > a.firstscan 
where not exists(select 1 from visits c where a.visitorid_id = c.visitorid_id and c.scantime > a.firstscan and c.scantime < b.scantime)

没有 CTE 的查询:

select a.visitorid_id, firstname, lastname, a.firstscan, b.scantime as secundscan, TIMESTAMPDIFF(SECOND, b.scantime, a.firstscan) 
from (select visitorid_id, min(scantime) as firstscan from visits a group by visitorid_id) a 
inner join visitors v on v.visitorid = a.visitorid_id
inner join visits b on  a.visitorid_id = b.visitorid_id and b.scantime > a.firstscan 
where not exists(select 1 from visits c where a.visitorid_id = c.visitorid_id and c.scantime > a.firstscan and c.scantime < b.scantime)

【讨论】:

  • 感谢您愿意提供 sql 查询,sqlfiddle.com 说“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册以了解在 ' 附近使用的正确语法;与 firstvisit 为 ( select visitorid_id, min(scantime) as firstscan from visit' at line 1"
  • 关于您对日期列的查询,例如 scantime 包含日期和时间信息,要求是获取每个有可用扫描时间信息的日期的报告。考虑表 437 2019-12-27 09:00:00.000000 1 438 2019-12-27 18:00:00.000000 1 中的以下数据行。在这种情况下,预期输出为 2019-12-27 ,userfirstname1 userlastname1, 09:00:00.000000 ,2019-12-27 18:00:00.000000 9:00
  • WITH 子句可用于 mysql 8.0 版,但我的托管服务提供 mysql 服务器 5.6.40 版。因此,为 mysql 服务器版本 5.6.40 / 5.7 提供所需结果的 sql 查询将很有用。
  • 嗨 San B. 编辑了我的答案以删除 CTE。告诉我
  • 嗨,zip,不提供 CTE 的查询是在问题中提供的示例数据上运行的,它仅在 2019 年 12 月 25 日这一日期正确输出扫描时间的数据。它没有列出日期为 2019-12-26、2019-12-27、2019-12-28 和 2019-12-29 的其他扫描时间的数据,它需要为所有日期的扫描时间生成结果,以便可以接受它作为答案
猜你喜欢
  • 2010-09-25
  • 2020-08-04
  • 2018-08-02
  • 1970-01-01
  • 2020-05-25
  • 2010-12-09
  • 2023-01-14
  • 2022-12-04
  • 1970-01-01
相关资源
最近更新 更多