SQL 查询时间不适合



我很难理解这些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

我不明白以下内容。总时间和暂停时间现在是如何组成的?如何启用此功能,以便我只能计算 Python 的 ID 1 - 4 + ID 5 - 6 和 ID 4 - 5 的 c_c ++ 之间的暂停时间? 对于我可以计算结束的想法 - 正确开始将不胜感激。 谢谢和LG

您将无法通过简单的查询解决此问题。原因如下:

  • 您正在计算每月总计,这意味着每个namemin_startmax_ende时间将是当月记录此name条目的第一次和最后一次。因此,计算pause也将包括几天之间的所有休息时间。由于您的睡眠时间通常不计入pause,因此您必须在子查询中按天分组。这将为您提供每日min_startmax_ende,您可以进一步汇总。
  • 在计算pause时间时,您需要定义如何计算不同name的交错条目。如果我登录12-13 python14-15 c_c++,13 到 14 之间的小时会计入python还是c_c++?还是两者兼而有之?您将需要另一个子查询,该子查询根据该规则聚合pause时间。

所以答案是,你必须找出如何计算pause,然后在进行每月聚合之前在子查询中准备正确的数据。

我的解决方案:

$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
";

最新更新