TIMESTAMPDIFF在mysql中返回blob

时间:2016-11-25 01:19:35

标签: mysql

我的查询出现问题,我想显示两个表并按相同的日期对其进行分组,然后添加开始和结束时间的差异。这是我的表格:

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有一个值。

1 个答案:

答案 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,
相关问题