Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按行求和/分组,这些行在C语言中是以小时格式(120:15:10)表示的,就像在SQL中一样-选择sum(col1)、col2、col3按col2、col3分组_C#_Sql Server - Fatal编程技术网

C# 如何按行求和/分组,这些行在C语言中是以小时格式(120:15:10)表示的,就像在SQL中一样-选择sum(col1)、col2、col3按col2、col3分组

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、发生次

问题: 我有一个带有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);