Mysql根据条件添加时间
Mysql add time based on conditions
我有一个table结构如下
+---------------------+---------+
| date_time | portNo1 |
+---------------------+---------+
| 2016-01-08 13:15:46 | 1 |
| 2016-01-08 13:16:01 | 2 |
| 2016-01-08 13:16:16 | 1 |
| 2016-01-08 13:16:31 | 2 |
| 2016-01-08 13:16:46 | 1 |
| 2016-01-08 13:17:00 | 2 |
| 2016-01-08 13:17:16 | 1 |
| 2016-01-08 13:17:31 | 1 |
| 2016-01-08 13:17:46 | 0 |
| 2016-01-08 13:18:01 | 0 |
| 2016-01-08 13:18:16 | 0 |
| 2016-01-08 13:18:31 | 0 |
| 2016-01-08 13:18:41 | 0 |
| 2016-01-08 13:19:01 | 0 |
| 2016-01-08 13:19:16 | 0 |
| 2016-01-08 13:19:27 | 0 |
| 2016-01-08 13:19:41 | 0 |
| 2016-01-08 13:19:56 | 0 |
| 2016-01-08 13:20:11 | 0 |
| 2016-01-08 13:20:26 | 0 |
| 2016-01-08 13:20:41 | 0 |
| 2016-01-08 13:20:56 | 0 |
| 2016-01-08 13:21:16 | 0 |
| 2016-01-08 13:21:31 | 0 |
| 2016-01-08 13:21:43 | 0 |
| 2016-01-08 13:22:01 | 0 |
| 2016-01-08 13:22:16 | 0 |
| 2016-01-08 13:22:31 | 0 |
| 2016-01-08 13:22:46 | 0 |
| 2016-01-08 13:23:01 | 0 |
| 2016-01-08 13:23:12 | 0 |
| 2016-01-08 13:23:31 | 0 |
| 2016-01-08 13:23:46 | 2 |
| 2016-01-08 13:24:01 | 2 |
| 2016-01-08 13:24:16 | 2 |
| 2016-01-08 13:24:31 | 1 |
| 2016-01-08 13:24:46 | 2 |
| 2016-01-08 13:25:00 | 2 |
现在我要做的只是添加 portNo1
值不是 0
的时间
这意味着它应该在几秒钟内将时间从 13:15:46
增加到 13:17:31
然后因为在那之后所有记录直到 13:23:46
值是 0
它应该忽略那个时间并继续。然后再次从 13:23:46
得到 portNo1
值,它应该取 13:23:46
和 13:23:31
之间的差异并将其添加到之前的差异中。伙计们,我在 perl 中尝试了很多,但没有得到正确的值,如果在 mysql 中有任何简单的方法,请告诉我。
除非我完全理解问题,否则你可以这样做:
SELECT SUM(UNIX_TIMESTAMP(date_time)-UNIX_TIMESTAMP(prevtime))
FROM (
SELECT date_time, portNo1, @prevTime as prevtime,
@prevTime := date_time
FROM MyTable
) t1
WHERE (portNo1 > 0 AND prevtime IS NOT null)
如果当前行中的 portNo1
大于 0,这将对当前行和上一行之间的时间差(以秒为单位)求和。这是你想要的吗?
我在这里做了一个fiddle:http://sqlfiddle.com/#!9/b6dfa/3
我有一个table结构如下
+---------------------+---------+
| date_time | portNo1 |
+---------------------+---------+
| 2016-01-08 13:15:46 | 1 |
| 2016-01-08 13:16:01 | 2 |
| 2016-01-08 13:16:16 | 1 |
| 2016-01-08 13:16:31 | 2 |
| 2016-01-08 13:16:46 | 1 |
| 2016-01-08 13:17:00 | 2 |
| 2016-01-08 13:17:16 | 1 |
| 2016-01-08 13:17:31 | 1 |
| 2016-01-08 13:17:46 | 0 |
| 2016-01-08 13:18:01 | 0 |
| 2016-01-08 13:18:16 | 0 |
| 2016-01-08 13:18:31 | 0 |
| 2016-01-08 13:18:41 | 0 |
| 2016-01-08 13:19:01 | 0 |
| 2016-01-08 13:19:16 | 0 |
| 2016-01-08 13:19:27 | 0 |
| 2016-01-08 13:19:41 | 0 |
| 2016-01-08 13:19:56 | 0 |
| 2016-01-08 13:20:11 | 0 |
| 2016-01-08 13:20:26 | 0 |
| 2016-01-08 13:20:41 | 0 |
| 2016-01-08 13:20:56 | 0 |
| 2016-01-08 13:21:16 | 0 |
| 2016-01-08 13:21:31 | 0 |
| 2016-01-08 13:21:43 | 0 |
| 2016-01-08 13:22:01 | 0 |
| 2016-01-08 13:22:16 | 0 |
| 2016-01-08 13:22:31 | 0 |
| 2016-01-08 13:22:46 | 0 |
| 2016-01-08 13:23:01 | 0 |
| 2016-01-08 13:23:12 | 0 |
| 2016-01-08 13:23:31 | 0 |
| 2016-01-08 13:23:46 | 2 |
| 2016-01-08 13:24:01 | 2 |
| 2016-01-08 13:24:16 | 2 |
| 2016-01-08 13:24:31 | 1 |
| 2016-01-08 13:24:46 | 2 |
| 2016-01-08 13:25:00 | 2 |
现在我要做的只是添加 portNo1
值不是 0
的时间
这意味着它应该在几秒钟内将时间从 13:15:46
增加到 13:17:31
然后因为在那之后所有记录直到 13:23:46
值是 0
它应该忽略那个时间并继续。然后再次从 13:23:46
得到 portNo1
值,它应该取 13:23:46
和 13:23:31
之间的差异并将其添加到之前的差异中。伙计们,我在 perl 中尝试了很多,但没有得到正确的值,如果在 mysql 中有任何简单的方法,请告诉我。
除非我完全理解问题,否则你可以这样做:
SELECT SUM(UNIX_TIMESTAMP(date_time)-UNIX_TIMESTAMP(prevtime))
FROM (
SELECT date_time, portNo1, @prevTime as prevtime,
@prevTime := date_time
FROM MyTable
) t1
WHERE (portNo1 > 0 AND prevtime IS NOT null)
如果当前行中的 portNo1
大于 0,这将对当前行和上一行之间的时间差(以秒为单位)求和。这是你想要的吗?
我在这里做了一个fiddle:http://sqlfiddle.com/#!9/b6dfa/3