我的查询出现问题,我想显示两个表并按相同的日期对其进行分组,然后添加开始和结束时间的差异。这是我的表格:
equipment_schedule
id | equipment_id | booked_date | created_at | updated_date
1 | 1 | 2016-11-21 | 2016-11-21 21:21:21 | 2016-11-21 21:21:21
2 | 1 | 2016-11-22 | 2016-11-22 21:21:21 | 2016-11-22 21:21:21
3 | 1 | 2016-11-23 | 2016-11-23 21:21:21 | 2016-11-23 21:21:21
4 | 1 | 2016-11-24 | 2016-11-24 21:21:21 | 2016-11-24 21:21:21
5 | 1 | 2016-11-25 | 2016-11-25 21:21:21 | 2016-11-25 21:21:21
6 | 1 | 2016-11-26 | 2016-11-26 21:21:21 | 2016-11-26 21:21:21
7 | 1 | 2016-11-27 | 2016-11-27 21:21:21 | 2016-11-27 21:21:21
8 | 1 | 2016-11-28 | 2016-11-28 21:21:21 | 2016-11-28 21:21:21
9 | 1 | 2016-11-29 | 2016-11-29 21:21:21 | 2016-11-29 21:21:21
10 | 1 | 2016-11-30 | 2016-11-30 21:21:21 | 2016-11-30 21:21:21
equipment_operation
id | equipment_id | start_time | end_time | creation_date | updated_date
1 | 1 | 2016-11-21 09:20:00 | 2016-11-21 23:59:59 | 2016-11-21 09:00:00 | 2016-11-21 09:00:00
2 | 1 | 2016-11-22 09:20:00 | 2016-11-22 13:00:00 | 2016-11-22 09:00:00 | 2016-11-22 09:00:00
3 | 1 | 2016-12-01 09:20:00 | 2016-12-01 13:00:00 | 2016-12-01 09:00:00 | 2016-12-01 09:00:00
4 | 1 | 2016-11-22 14:00:00 | 2016-11-22 18:00:00 | 2016-11-22 14:00:00 | 2016-11-22 14:00:00
我的疑问是:
SELECT a.id, booked,
IF(a.diff = "diff", 0, a.diff) AS diff,
creation_date,
updated_date
FROM
(
SELECT equipment_operation.id,
(
SELECT IF (DATE_FORMAT(equipment_operation.creation_date, "%m-%d-%Y") = DATE_FORMAT(booked_date, "%m-%d-%Y"), booked_date, 0)
FROM equipment_schedule WHERE DATE_FORMAT(equipment_schedule.created_at, "%m-%d-%Y") = DATE_FORMAT(equipment_operation.creation_date, "%m-%d-%Y")
) AS booked, SUM(TIMESTAMPDIFF(SECOND, start_time, end_time)) AS diff,
equipment_operation.creation_date as creation_date, equipment_operation.updated_date as updated_date FROM equipment_operation
INNER JOIN equipment_schedule ON (equipment_schedule.equipment_id = equipment_operation.equipment_id)
GROUP BY DATE_FORMAT(equipment_operation.creation_date, "%m-%d-%Y")
UNION ALL
SELECT id, booked_date, "diff", created_at as creation_date, updated_at as updated_date FROM equipment_schedule
) a
GROUP BY DATE_FORMAT(a.creation_date, "%m-%d-%Y")
diff返回blob,但是当我删除总和时,它将以秒为单位返回start_time和end_time的差异,但是它会给出错误的查询,因为它没有添加相同的日期。
我的输出:
id | booked | diff | creation_date | updated_date
1 | 2016-11-21 | BLOB | 2016-11-21 09:00:00 | 2016-11-21 09:00:00
2 | 2016-11-22 | BLOB | 2016-11-22 09:00:00 | 2016-11-22 09:00:00
3 | 2016-11-23 | BLOB | 2016-11-23 05:58:09 | 2016-11-23 05:58:09
4 | 2016-11-24 | BLOB | 2016-11-24 05:58:16 | 2016-11-24 05:58:16
5 | 2016-11-25 | BLOB | 2016-11-25 05:58:16 | 2016-11-25 05:58:16
6 | 2016-11-26 | BLOB | 2016-11-26 05:58:17 | 2016-11-26 05:58:17
7 | 2016-11-27 | BLOB | 2016-11-27 01:56:19 | 2016-11-27 01:56:19
8 | 2016-11-28 | BLOB | 2016-11-28 01:56:19 | 2016-11-28 01:56:19
9 | 2016-11-29 | BLOB | 2016-11-29 01:57:34 | 2016-11-29 01:57:34
10 | 2016-11-30 | BLOB | 2016-11-30 01:58:17 | 2016-11-30 01:58:17
3 | null | BLOB | 2016-12-01 09:00:00 | 2016-12-01 09:00:00
我的预期输出是diff有一个值。
答案 0 :(得分:2)
以下是您的查询问题:
SELECT id, booked_date, "diff", ...
^^^
您正在两个表之间执行UNION
,并且在联合的前半部分中,您具有diff
列的整数之和,而在下半部分中您有一个字符串。通常,要求所有列的类型一致。解决这个问题的一种方法是将时间戳差异项转换为char
,即
CAST(SUM(TIMESTAMPDIFF(SECOND, start_time, end_time)) AS CHAR(5)) AS diff,
<强>更新强>
如果您遇到上述演员表的问题,可以尝试以下方法:
CONCAT(SUM(TIMESTAMPDIFF(SECOND, start_time, end_time)), '') AS diff,
或尝试使用空格填充数字左侧:
LPAD(CAST(SUM(TIMESTAMPDIFF(SECOND, start_time, end_time)) AS CHAR(5)), 5, ' ') AS diff,