从数据表到文本框的格式化时间总和

时间:2019-04-26 09:54:29

标签: c# mysql sql types sum

我正在尝试从数据库查询创建的数据表中汇总值。

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

如果我们能为这个烦人的问题找到解决方案,我将非常高兴。

感谢您燃烧的脑细胞;)

1 个答案:

答案 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