Member 12324523 Ответов: 2

Как отобразить часы работы с часами и минутами


Ниже приведен мой запрос и мой код c# проблема в том, что мне нужно отобразить сумму в часах и минутах, но я получаю эту ошибку недопустимое использование агрегатной функции Sum() и типа: String.Как я могу ее решить

CAST(DATEDIFF(Minute,FromDate, ToDate) / 60 AS VARCHAR(5)) + ' Hrs' + ':' + RIGHT('0' + CAST(DATEDIFF(Minute, FromDate, ToDate) % 60 AS VARCHAR(2)), 2) + ' Min' AS 'Hr'


Что я уже пробовал:

Я пытался

var result = Dt.AsEnumerable().Sum(x => Convert.ToInt32(x["Hr"]));


и еще я пытался

dt.Columns.Add("temp", typeof(int), "Convert(Hr, 'System.Int32')");
var str = dt.Compute("Sum(temp)", "Name='a' and Value is not null");
но не работает

Maciej Los

На первом Локе, ниже утверждение:

CAST(DATEDIFF(Minute,FromDate, ToDate) / 60 AS VARCHAR(5)) + ' Hrs' + ':' + RIGHT('0' + CAST(DATEDIFF(Minute, FromDate, ToDate) % 60 AS VARCHAR(2)), 2) + ' Min' AS 'Hr'

возвращает строки, подобные этой: 9 Hrs:22 Min
Таким образом, вы не можете просто суммировать значения, хранящиеся в такой строке. Вам нужно удалить "Hrs "и" Min " из этой строки, а затем разделить строку на 2 поля: hours и mins. В конце концов, вы сможете подвести итог!

2 Ответов

Рейтинг:
2

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу.

У вас есть 2 варианта решения вашей проблемы:


  1. на стороне SQL server
    Измените инструкцию SQL, чтобы получить часы и минуты в отдельных полях
    SELECT ID, [name], [FromDate], [ToDate], CAST(DATEDIFF(Minute,FromDate, ToDate) / 60 AS VARCHAR(5)) As 'Hrs',
        RIGHT('0' + CAST(DATEDIFF(Minute, FromDate, ToDate) % 60 AS VARCHAR(2)), 2) As 'Mins'
    FROM records
    WHERE <<criteria>>

    После этого вы сможете суммировать часы и минуты.
  2. на стороне клиента (с помощью Linq)
    DataTable dt1 = new DataTable();
    dt1.Columns.Add(new DataColumn("Hr", typeof(string)));
    dt1.Rows.Add(new object[]{"9 Hrs:05 Min"});
    dt1.Rows.Add(new object[]{"0 Hrs:15 Min"});
    dt1.Rows.Add(new object[]{"1 Hrs:23 Min"});
    dt1.Rows.Add(new object[]{"3 Hrs:51 Min"});
    dt1.Rows.Add(new object[]{"2 Hrs:32 Min"});
    dt1.Rows.Add(new object[]{"4 Hrs:44 Min"});
    
    var result = dt1.AsEnumerable()
    	.Select(a=>a.Field<string>("Hr").Replace(" Hrs",  string.Empty).Replace(" Min", string.Empty))
    	.Select(b=>new
    		{
    			Hrs = Convert.ToInt32(b.Split(new string[]{":"}, StringSplitOptions.RemoveEmptyEntries)[0]),
    			Mins = Convert.ToInt32(b.Split(new string[]{":"}, StringSplitOptions.RemoveEmptyEntries)[1]),
    		})
    	.GroupBy(c=>1)
    	.Select(d=>new
    		{
    			TotalHrs = d.Sum(x=>x.Hrs),
    			TotalMins = d.Sum(x=>x.Mins)
    		})
    	.ToList();

    Выше код будет возвращен:
    TotalHrs TotalMins
    19       170

    Как вы знаете, вы должны разделить минуты на значение 60, чтобы иметь возможность добавить результат расчета к часам, а остальное деление-к минутам.


Удачи вам!


Member 12324523

я не получаю TotalHrs TotalMins
19 170 как вы связываете я не получаю тай вывода

Рейтинг:
1

Patrice T

Никогда не создавайте SQL-запрос путем конкатенации с пользовательскими вводами, он называется "SQL-инъекция", он опасен для вашей базы данных и подвержен ошибкам.
Одна кавычка в имени - и ваша программа рухнет. Если пользовательский ввод типа "Брайан О'Коннер" может привести к сбою вашего приложения, то это уязвимость SQL-инъекции.
SQL-инъекция-Википедия[^]
SQL-инъекция[^]