从Datatable到textBox的格式化时间总和

问题描述 投票:-2回答:1

我试图从数据库查询创建的数据表中总结值。

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

如果我们找到解决这个同时令人讨厌的问题的解决方案,我将非常高兴。

谢谢你燃烧的脑细胞;)

c# mysql sql types sum
1个回答
0
投票

我认为使用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

© www.soinside.com 2019 - 2024. All rights reserved.