我试图从数据库查询创建的数据表中总结值。
MySQL DB中的时间格式为HH:mm:ss(ss始终为00)
我已经有了这个运行我只是对结果不满意,例如25小时结果导致1.01:00:00或1天1小时我想收到25小时,因为它保存在数据库中,更改数据类型在mysql中我不是一个选项,因为我有一堆calc需要那些作为数据类型的时间。
现在代码不再能够在textBox中显示结果,因为我有更多的错误:
“聚合函数Sum()和Type:String的使用无效。”
据我所知,我无法对字符串,时间和数字进行求和,但是我可以在格式化时间之前将其从数据库中拉出来。
我在谷歌搜索了几天的好解决方案,但我看到的唯一选择是认为我已经自己尝试过(原因再次测试了更多错误)
但是,这是必需的代码段:
MySqlCommand cmddttoday = conn.CreateCommand();
cmddttoday.CommandType = CommandType.Text;
cmddttoday.CommandText = "SELECT day, month, date_format (start, '%H:%i') start, date_format (stop, '%H:%i') stop, date_format (total, '%H:%i') total FROM arbeitszeiten WHERE username = '" + textBoxusername.Text + "' and day = '" + today + "' and month = '" + month + "' and year = '" + thisyear + "'";
cmddttoday.ExecuteScalar();
DataTable dttimetoday = new DataTable();
MySqlDataAdapter datadatoday = new MySqlDataAdapter(cmddttoday);
datadatoday.Fill(dttimetoday);
textBoxtimetoday.Text = dttimetoday.Compute("SUM(total)", "").ToString();
dttimetoday.Columns["day"].ColumnName = "Tag";
dttimetoday.Columns["month"].ColumnName = "Monat";
dttimetoday.Columns["start"].ColumnName = "Arbeit aufgenommen";
dttimetoday.Columns["stop"].ColumnName = "Arbeit abgelegt";
dttimetoday.Columns["total"].ColumnName = "Zeit gesammt";
请记住,是的,它不能像这样工作,但没有查询中的总格式,它显示如前所述为1.01:00:00
如果我们找到解决这个同时令人讨厌的问题的解决方案,我将非常高兴。
谢谢你燃烧的脑细胞;)
我认为使用TIMESTAMPDIFF可以更容易地在几分钟内直接计算时差。从那里你可以使用SUM来计算总分钟数。要获得时间,你可以简单地除以60.这看起来像这样:
SELECT SUM(TIMESTAMPDIFF(Minute,start, end)/60) from arbeitszeiten
看看这个小提琴:Link
编辑:
如果是这样的话,你必须使用linq。您得到的错误是因为数据表列“total”是数据类型字符串。由于你不能总结一个字符串,这不会工作。由于Compute方法请求括号内的数字,因此无法使用SUM函数进行转换。
使用linq你可以这样做:
textBoxtimetoday.Text = dttimetoday.AsEnumerable().Sum(r => Convert.ToDecimal(r.Field<string>(4))).ToString();
但你必须用date_format (total, '%H:%i') total
取代date_format (total, '%H.%i') total