MySQL使用1列

时间:2018-02-20 12:56:13

标签: mysql

实施例

| ID |   LOGS   |
| 1  |  8:00:00 | --this is time in,
| 1  |  12:00:00| --this is time out,
| 2  |  20:00:00| -- time in,
| 2  |  8:00:00 | -- time out,

我需要解决时间和时间之间的小时数。时间和超时可在1列中找到。我是MySQL的新手,想要练习这个。

1 个答案:

答案 0 :(得分:0)

鉴于我目前所知道的......(这很接近,但考虑到一些缺失的组件,这在技术上是无法解决的)

我不认为这是“正确”的答案,因为我不确定日志数据类型,如果它包含日期字段或只是时间。如果只是时间我不确定如何考虑可能不同的天数;以及如何处理记录的排序,因为订单无法保证。

我也不确定你的数据是否缺少对以及我们如何处理它。说有人没有键入但键入或反之亦然。我们如何处理这种情况?

以下内容是使用用户变量(@ RN,@ RN2)模拟row_number功能,并为每条记录分配1,2,3,4 ..等RN。使用此行号生成两个相同的数据集。然后我将这些数据集连接在DS1.rownumber + 1 = DS2.rownumber上,数据集1的行号仅限于使用mod函数的奇数行。这意味着我们现在可以从date1中减去date2并获得差异。

SELECT ID, Col2DT, Col1DT, timestampDiff(Minute, COl2DT, Col1DT) as MinDiff
FROM (SELECT ID, Logs col1DT , @RN:=@RN+1 RN
      FROM TableName
      CROSS JOIN (SELECT @RN:=0)
      ORDER BY ID, Logs Asc) Der_Tab1
INNER JOIN (SELECT ID, LogsCol2DT, @RN2:=@RN2+1 RN
            FROM TableName
            CROSS JOIN (SELECT @RN2:=0)
            ORDER BY ID, Logs Asc) Der_Tab2
  on Der_tab1.ID = Der_tab2.ID
 and der_tab2.RN+1 = DerTab2.RN
WHERE mod(Der_tab1.RN,2)=1
  • 交叉连接简单声明&初始化用户变量@RN& @ RN2到0
  • 每个子查询的顺序确保我们为每个ID分配正确的行号,假设log是时间戳数据类型
  • mod(der_tab1.rn,2)= 1确保所有奇数行都在我的第一个der_tab1数据集中。这意味着如果我们假设每个ID有两个输入/输出的日志,那么基于连接的所有偶数都将在第二个数据集(der_tab2)中,那么这种方法将为我们提供我们需要减去的1个记录中的两个日期值
  • 外部选择然后进行数学计算并显示ID,减去两个日期以及以分钟为单位的结果差异。