Суммирование форматированных времен из Datatable в textBox - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь суммировать значения из таблицы данных, созданной из запроса к базе данных.

Время в БД MySQL форматируется как ЧЧ: мм: сс (сс всегда 00)

У меня уже был этот запуск, я просто был недоволен результатом, например, за 25 часов результат привел к 1,01: 00: 00 или 1 дню и 1 часу, когда я хотел получить 25 ч, поскольку он сохранен в базе данных, изменение типа данных в mysql не вариант для меня, так как у меня есть куча calc, которые нуждаются в них как тип данных time.

В настоящее время код больше не может отображать результат в текстовом поле, так как у меня больше, чем ошибка:

"Неправильное использование агрегатной функции Sum () и Type: 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 голосов
/ 26 апреля 2019

Я думаю, что использование TIMESTAMPDIFF было бы намного проще рассчитать разницу во времени в минутах напрямую. Оттуда вы можете использовать SUM для расчета общего количества минут. Чтобы получить часы, вы можете просто разделить их на 60. Это будет выглядеть так:

SELECT SUM(TIMESTAMPDIFF(Minute,start, end)/60) from arbeitszeiten 

Проверьте эту скрипку: Ссылка

EDIT:

Если это так, вы должны использовать linq. Вы получаете ошибку, потому что столбец данных «итого» имеет строку типа данных. Так как вы не можете суммировать строку, это не сработает. Вы не можете конвертировать с помощью функции 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...