我正在尝试从数据库查询创建的数据表中汇总值。
MySQL DB中的时间格式为HH:mm:ss(ss始终为00)
我已经运行过此程序,我对结果不满意,例如25小时,因为当我希望将25小时保存在数据库中时,结果是1.01:00:00或1天零1小时,更改mysql中的数据类型对我来说不是一个选择,因为我有一堆需要这些作为数据类型时间的calc。
现在,代码不再能够在文本框中显示结果,因为我的错误更少了:
“无效使用了聚合函数Sum()和类型:String。”
据我所知,我不能对字符串(时间和数字)求和,但是我可以在格式化时间之前将其从数据库中取出来进行格式化。
我已经在Google上搜索了好几天的解决方案,但是我看到的唯一选择是认为我已经自己尝试过了(原因再次测试了更多错误)
但这是必需的代码段:
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
如果我们能为这个烦人的问题找到解决方案,我将非常高兴。
感谢您燃烧的脑细胞;)
答案 0 :(得分:0)
我认为使用TIMESTAMPDIFF可以更轻松地直接计算以分钟为单位的时差。从那里,您可以使用SUM来计算分钟总数。要获得小时数,您可以简单地除以60。这看起来像这样:
SELECT SUM(TIMESTAMPDIFF(Minute,start, end)/60) from arbeitszeiten
查看此小提琴:Link
编辑:
如果是这种情况,则必须使用linq。您得到的错误是因为datatable列“ total”属于数据类型字符串。由于您不能求和一个字符串,因此将不起作用。您不能使用SUM函数进行转换,因为Compute方法要求在方括号内输入数字。
使用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