繁体   English   中英

将WHERE和GROUP BY合并到日期时间总和MySQL查询中

[英]Incorporate WHERE and GROUP BY into datetime sum MySQL query

我的查询:

我正在尝试按类别汇总“持续时间”列:

SELECT DATE_FORMAT(FROM_UNIXTIME(sum(`duration`)), '%T') AS `totalduration` 
FROM `my_custom_table`
WHERE `category` = "SLE"
GROUP BY `category`

结果为NULL,但应为“ 05:00”。

如果我排除WHERE和GROUP BY,查询将正确汇总:

SELECT DATE_FORMAT(FROM_UNIXTIME(sum(`duration`)), '%T') AS `totalduration`
FROM `my_custom_table`

结果正确是24:00:00。

如何将WHERE和GROUP BY合并到查询中?

我的资料:

phpMyAdmin / MySQL表,由“ duration”列(日期时间)和“ category”列(varchar 255)组成:

0000-00-00 05:00:00 | SLE
0000-00-00 00:30:00 | CLA
0000-00-00 00:30:00 | CLA
0000-00-00 00:15:00 | FOO
0000-00-00 01:45:00 | MON
0000-00-00 00:30:00 | CLA
0000-00-00 01:30:00 | MON
0000-00-00 02:30:00 | CLE
0000-00-00 01:00:00 | CLA
0000-00-00 01:30:00 | MON
0000-00-00 01:00:00 | REC
0000-00-00 00:30:00 | CLA
0000-00-00 01:30:00 | MON
0000-00-00 00:45:00 | CLA
0000-00-00 01:00:00 | FOO
0000-00-00 01:00:00 | REC
0000-00-00 01:00:00 | REC
0000-00-00 01:00:00 | MON
0000-00-00 00:15:00 | NOT
0000-00-00 00:30:00 | CLA
0000-00-00 00:30:00 | CLA

我已经为您创建了一个SQLFiddle: http ://sqlfiddle.com/#!9/f31e6a/6/0

查询:

SELECT category, SEC_TO_TIME(SUM(TIME_TO_SEC(duration)))
FROM test
WHERE category = 'SLE'
GROUP BY category;

测试数据:

CREATE TABLE test (duration DATETIME, category TEXT);

INSERT INTO test (duration, category) VALUES
('0000-00-00 05:00:00', 'SLE'),
('0000-00-00 00:30:00', 'CLA'),
('0000-00-00 00:30:00', 'CLA'),
('0000-00-00 00:15:00', 'FOO'),
('0000-00-00 01:45:00', 'MON'),
('0000-00-00 00:30:00', 'CLA'),
('0000-00-00 01:30:00', 'MON'),
('0000-00-00 02:30:00', 'CLE'),
('0000-00-00 01:00:00', 'CLA'),
('0000-00-00 01:30:00', 'MON'),
('0000-00-00 01:00:00', 'REC'),
('0000-00-00 00:30:00', 'CLA'),
('0000-00-00 01:30:00', 'MON'),
('0000-00-00 00:45:00', 'CLA'),
('0000-00-00 01:00:00', 'FOO'),
('0000-00-00 01:00:00', 'REC'),
('0000-00-00 01:00:00', 'REC'),
('0000-00-00 01:00:00', 'MON'),
('0000-00-00 00:15:00', 'NOT'),
('0000-00-00 00:30:00', 'CLA'),
('0000-00-00 00:30:00', 'CLA');

以及相应的结果:

category    SEC_TO_TIME(SUM(TIME_TO_SEC(duration)))
SLE     05:00:00
SELECT DATE_FORMAT(FROM_UNIXTIME(sum(`duration`)), '%T') AS `totalduration` 
FROM `my_custom_table`
GROUP BY `category` 
HAVING category = "SLE"

我认为不需要使用group by,因为where子句仅返回一个数据。因此,您可以执行以下操作。

SELECT DATE_FORMAT(FROM_UNIXTIME(sum(`duration`)), '%T') AS `totalduration` 
FROM `my_custom_table`
WHERE `category` = "SLE"

如果仍然返回null,则可以执行以下操作。

SELECT DATE_FORMAT(FROM_UNIXTIME(sum(`duration`)), '%T') AS `totalduration` 
FROM `my_custom_table`
WHERE `category` LIKE "%SLE%"

只需使用to_seconds()

select sum(to_seconds(duration))

如果您希望使用时间格式:

select sec_to_time(sum(to_seconds(duration)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM