我在理解这些SQL查询如何正常运行时遇到了问题。
我已插入以下数据库条目:
ID | Name | start | ende | jahr | tag | monat | beschreibung
1 | python | 19:33:00 | 19:33:35 | 2017 | 18 | 7 | etwas
2 | python | 19:34:35 | 19:36:35 | 2017 | 18 | 7 | etwas
3 | python | 19:37:35 | 19:38:35 | 2017 | 18 | 7 | etwas
4 | c_c++ | 20:38:35 | 20:39:35 | 2017 | 18 | 7 | etwas
5 | python | 21:37:35 | 21:38:35 | 2017 | 18 | 7 | etwas
6 | c_c++ | 21:39:35 | 21:40:35 | 2017 | 18 | 7 | etwas
如果我现在问以下全部内容:
$sql = "SELECT name, tag, jahr, monat, min(start) as min_start, max(ende) as max_ende,
SEC_TO_TIME( SUM( ende - start ) ) as gesamtzeit,
SEC_TO_TIME( SUM(TIME_TO_SEC(ende)) - SUM(TIME_TO_SEC(start))) as arbeitszeit,
SEC_TO_TIME( SUM(ende - start) - (SUM(TIME_TO_SEC(ende)) - SUM(TIME_TO_SEC(start))) ) as pause,
GROUP_CONCAT(beschreibung) as besch
FROM lernen
WHERE monat = $monat_1 AND jahr = $jahr_1
GROUP BY name";
$db_erg = mysql_query( $sql ); if ( ! $db_erg ) { die('Ungültige Abfrage: ' . mysql_error()); }
我得到以下结果:
Tag | Monat | Jahr | von | bis | Gesamtzeit | Arbeitszeit | Pause | Name | Beschreibung
18 | 7 | 2017 | 20:38:35 | 21:40:35 | 00:03:20 | 00:02:00 | 00:01:20 | c_c++ | etwas
18 | 7 | 2017 | 19:33:00 | 21:38:35 | 00:07:15 | 00:04:35 | 00:02:40 | python | etwas
我不明白以下几点。暂停的总时间和时间如何组成?如何启用此功能,以便我只能计算ID为1 - 4 + ID 5 - 6(对于python)和对于c_c ++(ID 4 - 5)之间的暂停时间吗? 对于一个想法,我可以计算结束 - 正确开始将非常感激。 thx和lg
答案 0 :(得分:0)
您无法通过简单的查询解决此问题。出于这些原因:
min_start
的{{1}}和max_ende
时间将是该月的第一个和最后一个时间{{1}的条目记录了。因此,计算出的name
也包括天之间的所有休息时间。由于您的睡眠时间通常不计入name
,您必须在子查询中按天分组。这会为您提供每日pause
和pause
,您可以进一步汇总。min_start
时间时,您需要定义如何计算不同max_ende
的交错条目。如果我记录pause
和name
,那么13到14之间的小时会计入12-13 python
还是14-15 c_c++
?或两者?您将需要另一个子查询,根据该规则聚合python
时间。所以答案是你必须找出如何计算c_c++
,然后在进行每月聚合之前在子查询中准备正确的数据。
答案 1 :(得分:0)
我的解决方案:
$sql = "
select name,
DATE_FORMAT(start, '%d.%m.%Y') as datum,
min(DATE_FORMAT(start, '%H:%i:%s')) AS start,
max(DATE_FORMAT(ende, '%H:%i:%s')) AS ende,
(select SEC_TO_TIME(TIMESTAMPDIFF(SECOND, min(start), max(ende))) from zeiten ) as ges_zeit,
SEC_TO_TIME(sum(TIMESTAMPDIFF(SECOND, start, ende)) ) as arbeitszeit,
SEC_TO_TIME(TIMESTAMPDIFF(SECOND, start, ende) ) as diff_2,
SEC_TO_TIME(sum(TIMESTAMPDIFF(SECOND, start, ende)) ) as diff_1,
SEC_TO_TIME((select TIMESTAMPDIFF(SECOND, min(start), max(ende)) from zeiten ) - (select sum(TIMESTAMPDIFF(SECOND, start, ende) ) from zeiten)) as diff,
beschreibung as besch
FROM zeiten
WHERE DATE_FORMAT(start, '%m') = $monat_1 AND DATE_FORMAT(start, '%Y') = $jahr_1
group by start
order by DATE_FORMAT(start, '%d %H') DESC
";