我有四列(驱动程序ID,开始时间,结束时间,花费的分钟) “用户登录开始时间”列将被填写,当用户注销结束时间将被填写并计算总分钟数时。每次用户登录时都会插入新行
我正在尝试显示每一天花费的总分钟数
例如
Date (13 - 2 - 2019) - 630 minutes spent
Date ( 12 - 2 - 2019) - 450 minutes spent
etc...
但是在我的情况下,将12 -2 -2019(4AM)到13 -2-2019(3.59AM)视为一天
从后端进行编码的方式是,如果用户从(13-2-2019)(2am)登录到(13-2-2019)(6AM)..它将在数据库中存储两行。 如下所示:-
Driver ID | start time | End time | min spent
3229 | (13-2-2019)(2am)| (13-2-2019)(3.59am)| 120
3229 | (13-2-2019)(4am) (13-2-2019)(6.00am) | 120
在上面的示例中,第一行的最低消费应为12-2-2019 Date。为此,我使用了如下的BETWEEN查询。
下面的查询将输出两个结果:-
$sql = "SELECT * , date(start_time),sum(minutes_spent) FROM
driver_online_session where driver_id='3229' AND
start_time BETWEEN '2019-02-12 03:59:59' AND '2019-02-13 03:59:59'
GROUP by date(start_time)
ORDER BY start_time DESC";
电流输出:-
id 3229 date : 2019-02-13 01:07:20 min spent : 61
id: 3229 date : 2019-02-12 04:00:00 min spent : 1024
我的预期输出应该是
id 3229 date : 2019-02-12 04:00:00 min spent : 1085
请帮助我解决此查询。谢谢
答案 0 :(得分:1)
您是否尝试过将start_time
从组中删除(也可能从选择中删除),而只是按驱动程序ID进行分组(或者不按任何内容进行分组,因为驱动程序ID已限于单值)?
由于您还限制了可以将开始时间返回到单个“天”(由您定义)的时间,因此它应该只返回开始时间在允许范围内的所有行,并对所有行的总和求和这些行。而且,由于您已经知道“日期”,因此您实际上不需要输出它。
尝试一下:
SELECT
driver_id, sum(minutes_spent)
FROM
driver_online_session
WHERE
driver_id='3229' AND
start_time BETWEEN '2019-02-12 03:59:59' AND '2019-02-13 03:59:59'
当然,如果您需要更通用的解决方案(例如,一次可以显示多个“天”),那么效果就不太好-您必须找到一种方法来按自定义时间范围分组-但这为您提供了一个起点。
答案 1 :(得分:0)
找到了解决方案:- 从日期时间值和组中减去4小时
$sql = "SELECT driver_id , DATE(start_time - interval 4 hour),
SUM(minutes_spent)
FROM driver_online_session
where driver_id='3229' AND
start_time BETWEEN '2019-02-11 03:59:59' AND '2019-02-14 03:59:59'
GROUP by DATE(start_time - interval 4 hour)
ORDER BY date(start_time) DESC";