C# 将数据表中的格式化时间求和到文本框中

C# 将数据表中的格式化时间求和到文本框中,c#,mysql,sql,types,sum,C#,Mysql,Sql,Types,Sum,我试图从数据库查询创建的数据表中求和值 MySQL数据库中的时间格式为HH:mm:ss始终为00 我已经运行了这个,我只是对结果不满意,例如25小时,结果是1.01:00:00或1天1小时,当我想接收25小时,因为它保存在数据库中,更改mysql中的数据类型对我来说不是一个选项,因为我有一堆需要这些数据类型的计算时间 现在,代码不再能够在文本框中显示结果,因为我有更多的错误: 聚合函数Sum和Type:String的使用无效 据我所知,我不能对字符串求和,只能对时间和数字求和,但我可以在将时间从

我试图从数据库查询创建的数据表中求和值

MySQL数据库中的时间格式为HH:mm:ss始终为00

我已经运行了这个,我只是对结果不满意,例如25小时,结果是1.01:00:00或1天1小时,当我想接收25小时,因为它保存在数据库中,更改mysql中的数据类型对我来说不是一个选项,因为我有一堆需要这些数据类型的计算时间

现在,代码不再能够在文本框中显示结果,因为我有更多的错误:

聚合函数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";
请记住,是的,它不是这样工作的,但是在查询中没有total的格式,它显示为1.01:00:00

如果我们能找到解决这个恼人问题的办法,我会非常高兴


感谢你燃烧的脑细胞

我认为使用TIMESTAMPDIFF将更容易直接计算以分钟为单位的时差。在此基础上,您可以使用SUM计算总分钟数。要得到小时数,只需除以60即可。这看起来像这样:

SELECT SUM(TIMESTAMPDIFF(Minute,start, end)/60) from arbeitszeiten 
看看这把小提琴:

编辑:

如果是这种情况,您必须使用linq。您得到的错误是因为datatable列total是数据类型字符串。既然你不能对一个字符串求和,这就行不通了。也不能使用SUM函数进行转换,因为Compute方法要求括号内的数字

使用linq,您可以这样做:

 textBoxtimetoday.Text = dttimetoday.AsEnumerable().Sum(r => Convert.ToDecimal(r.Field<string>(4))).ToString();

但是您必须将日期格式总计,'%H:%i'总计替换为日期格式总计,'%H.%i'总计

我对此不太了解。。注意到我的第一条评论是完全没有意义的,所以再次:我们最终会得到像1.75小时这样的值,这是非常不友好和不自然的,读起来是1小时45分钟,我再次看到在编辑/更新值时人的方面的潜在问题输入字符串的格式错误。。因为我现在不明白你在那里做了什么,我不知道那是从哪里来的。。我假设从db中填充时的格式?删除查询中的日期格式总计,“%H:%i”不是我希望的解决方案^MSDN声明列的默认数据类型是字符串:因此,如果在填充数据之前不显式更改它,它将是字符串OK,我不认为这会对从db调用数据产生影响,但是我们需要的列start、stop、total被设置为datatyp time。这是否意味着我必须改变它?我很抱歉,如果我没有理解你的意思,我所知道的关于编程的所有知识我必须在没有任何教学或其他东西的情况下自学,所以我想我错过了你在上一条消息中试图告诉我的内容。由于SQL注入,请不要在SQL脚本上使用字符串连接。您需要使用cmd.parameters.addwithvalue,这是一个严重错误。