Sql查询次数不合适

时间:2017-07-20 14:05:23

标签: mysql 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

我不明白以下几点。暂停的总时间和时间如何组成?如何启用此功能,以便我只能计算ID为1 - 4 + ID 5 - 6(对于python)和对于c_c ++(ID 4 - 5)之间的暂停时间吗? 对于一个想法,我可以计算结束 - 正确开始将非常感激。 thx和lg

2 个答案:

答案 0 :(得分:0)

您无法通过简单的查询解决此问题。出于这些原因:

  • 您正在计算每月总计,这意味着每个min_start的{​​{1}}和max_ende时间将是该月的第一个和最后一个时间{{1}的条目记录了。因此,计算出的name也包括天之间的所有休息时间。由于您的睡眠时间通常不计入name,您必须在子查询中按天分组。这会为您提供每日pausepause,您可以进一步汇总。
  • 计算min_start时间时,您需要定义如何计算不同max_ende的交错条目。如果我记录pausename,那么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
       ";