C# 如何按行求和/分组,这些行在C语言中是以小时格式(120:15:10)表示的,就像在SQL中一样-选择sum(col1)、col2、col3按col2、col3分组
问题: 我有一个带有C widowsform应用程序的sql数据库,该应用程序带有datagridview以显示结果。 我使用streamreader从csv导入数据。 我需要通过[col2],[col3]生成一个选择和[col1],[col2],[col3]组 但是我需要求和的列是nvarchar,它表示的是000:00:00格式的小时数 例如: 数据库列: 发生次数|解决方案|组内时间|组内时间 SQL Comamand:按发生次数、解决方案组选择sumtimein\u sgroup、发生次数、解决方案组 简历:我需要一列发生次数中的小时数总和,结果由两列发生次数和解决方案组分组 这是一个计算支持小组在事件中工作的总时间的系统 我需要这样一个结果=一个事件在解决方案组中停留的时间:C# 如何按行求和/分组,这些行在C语言中是以小时格式(120:15:10)表示的,就像在SQL中一样-选择sum(col1)、col2、col3按col2、col3分组,c#,sql-server,C#,Sql Server,问题: 我有一个带有C widowsform应用程序的sql数据库,该应用程序带有datagridview以显示结果。 我使用streamreader从csv导入数据。 我需要通过[col2],[col3]生成一个选择和[col1],[col2],[col3]组 但是我需要求和的列是nvarchar,它表示的是000:00:00格式的小时数 例如: 数据库列: 发生次数|解决方案|组内时间|组内时间 SQL Comamand:按发生次数、解决方案组选择sumtimein\u sgroup、发生次
occnum | groupnamelvl | total hours(SUM)
------------------------------------------
occ001 | sgrouplevel2 | 120:10:10
occ002 | sgrouplevel1 | 20:30:15
occ001 | sgrouplevel1 | 05:15:00
occ010 | sgrouplevel3 | 105:05:00
我看到了很多关于sum Hour的主题,这些主题显示了超过24小时的结果,但是当我已经用行数据编辑了一列时,解决方案不起作用,如下所示:
occnum | groupnamelvl | hours to sum
------------------------------------------
occ001 | sgrouplevel2 | 120:15:10
occ001 | sgrouplevel2 | 30:10:40
occ001 | sgrouplevel2 | 110:30:00
string[] t1 = "120:15:10".Split(':');
string[] t2 = "30:10:40".Split(':');
string[] t3 = "110:30:00".Split(':');
List<string[]> times = new List<string[]>();
times.Add(t1);
times.Add(t2);
times.Add(t3);
TimeSpan ts = new TimeSpan();
foreach (var item in times)
{
TimeSpan tsa = new TimeSpan(Convert.ToInt32(item[0]), Convert.ToInt32(item[1]), Convert.ToInt32(item[2]));
ts = (ts == TimeSpan.Zero) ? tsa : ts.Add(tsa);
}
Console.WriteLine((ts.Hours + (ts.Days * 24)).ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString());
如何对该列求和并显示结果,如:
occnum | groupnamelvl | Total_Hours
------------------------------------------
occ001 | sgrouplevel2 | 260:55:50
我使用这个,但它只适用于24小时的数据,结果可能大于24但小于99:
SELECT CONVERT(NVARCHAR,
DATEADD(Minute,
SUM(
DATEPART(SECOND,CONVERT(datetime,[colunm],8)) + 60 *
DATEPART(MINUTE,CONVERT(datetime,[colunm],8)) + 3600 *
DATEPART(HOUR,CONVERT(datetime,[colunm],8))
) /60, '00:00:00'), 108) AS [TOTAL] FROM tb
C带查询的部分:
Database1DataSet ds = new Database1DataSet();
string strSQL = "that query";
SqlCeConnection conn = new SqlCeConnection(@"Data Source=\App_sqlce35\App\DATA\Database1.sdf");
SqlCeDataAdapter da = new SqlCeDataAdapter(strSQL, conn);
try
{
conn.Open();
ds.Tables.Add("historico");
ds.Tables["historico"].BeginLoadData();
da.Fill(ds.Tables["historico"]);
ds.Tables["historico"].EndLoadData();
tb_histstatusDataGridView.DataSource = ds.Tables["historico"];
在@AsadAli的帮助下,新代码运行良好,但我无法按以下方式分组:
这很有效。有点不优雅,但很有效
假设times:是字符串的列表[],然后可以执行以下操作:
occnum | groupnamelvl | hours to sum
------------------------------------------
occ001 | sgrouplevel2 | 120:15:10
occ001 | sgrouplevel2 | 30:10:40
occ001 | sgrouplevel2 | 110:30:00
string[] t1 = "120:15:10".Split(':');
string[] t2 = "30:10:40".Split(':');
string[] t3 = "110:30:00".Split(':');
List<string[]> times = new List<string[]>();
times.Add(t1);
times.Add(t2);
times.Add(t3);
TimeSpan ts = new TimeSpan();
foreach (var item in times)
{
TimeSpan tsa = new TimeSpan(Convert.ToInt32(item[0]), Convert.ToInt32(item[1]), Convert.ToInt32(item[2]));
ts = (ts == TimeSpan.Zero) ? tsa : ts.Add(tsa);
}
Console.WriteLine((ts.Hours + (ts.Days * 24)).ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString());
下面是我将要做的一个例子:
int[] result = new int[3]; //Assuming the format is always as in OP
string[] times = { "120:15:10", "30:10:40", "110:30:00" };
foreach (string time in times)
{
string[] parts = time.Split(':');
for (int i = 0; i < parts.Length; i++)
{
result[i] += Convert.ToInt32(parts[i]);
}
}
TimeSpan ts = TimeSpan.FromSeconds(result[1] * 60 + result[2]);
result[0] += ts.Hours; result[1] = ts.Minutes; result[2] = ts.Seconds;
string resultString = string.Join(":", result);
我认为您为列选择了错误的数据类型。不必将这些值存储为字符串或日期时间,只需使用整数列,其中只存储秒的总数
260:50:55 = (260*60*60) + (50 * 60) + 55 = 939350 seconds.
现在有了一个完全可管理的求和聚合函数值
当需要显示值时,应用公式来分隔零件值
int seconds = GetDurationFromDatabase(); // IE=939350;
TimeSpan ts = new TimeSpan(0,0,seconds);
Console.WriteLine("{0}:{1}:{2}", ts.Days * 24 + ts.Hours, ts.Minutes, ts.Seconds);
此列的数据类型是什么?使用这些值创建DateTime对象并与之求和。你已经试过了吗?我把它设为NVARCHAR,所以我试着施放和转换,但只有当我的小时数小于24小时,我得到的结果超过24小时,但只到99:00:00,那么分别计算时间的每一部分小时、分和秒,并求和它们呢?可以使用string.Split“:”来分割时间。如果这还不清楚,我可以发布一个例子。在旁注上,结果是260:55:50,而不是160:55:50。这看起来不错,但我需要说我不是C程序员,我现在刚开始编程,不知道如何在我的查询中使用它:好吧,这个特定的部分将在你从查询中得到结果之后出现。一旦你得到了你的价值观,你就可以操纵它们。1.从数据库中获取数据;2.验证它们是字符串且格式正确;3.计算4.如果我的查询有大约100行,我真的不知道如何实现这个原因,如果我的查询有大约100行,我如何计算时间跨度ts。添加如果查询结果我来自一列和多行,我需要使用while?抱歉,但它不起作用,因为我需要它更精确,以这种方式,我需要将每一行字符串[]t放入,但手动操作!我尝试过将数据转换为int SQL Server,但无法导入。使用StreamReader从csv转换到数据库时,会出现错误和同样的问题。@AsadAli-它正在工作!非常感谢你,你给了我很大的帮助,我从这个问题/解决方案中学到了很多!如果需要按两列分组,还有一个问题。我最初的问题是,我需要按解决方案代码和区域对小组的小时数进行汇总。您能更具体地说明您的问题吗?请编辑您的原始问题以添加详细信息。@AsadAli抱歉,我现在编辑并添加说明和示例@我不明白你想做什么。
int seconds = GetDurationFromDatabase(); // IE=939350;
TimeSpan ts = new TimeSpan(0,0,seconds);
Console.WriteLine("{0}:{1}:{2}", ts.Days * 24 + ts.Hours, ts.Minutes, ts.Seconds);