【发布时间】:2014-06-20 21:00:15
【问题描述】:
问题: 我有一个带有 C# widowsform 应用程序的 sql 数据库,它带有 datagridview 来显示结果。 我使用流式阅读器从 csv 导入数据。 我需要做一个 SELECT SUM([col1]), [col2], [col3] GROUP BY [col2], [col3]
但我需要求和的列是 nvarchar,表示格式为“000:00:00”的小时
例子:
数据库列: 发生次数|解决方案组|timein_sgroup
SQL Comamand:Select sum(timein_sgroup),occurrence_number,solution_group 按occurrence_number 分组,solution_group
resume:我需要一列中的总小时数(occurence_number),结果按两列分组(occurence_number 和 solution_group)
这是一个系统,用于计算支持小组在事件中保持工作的总时间。
我需要这样的结果 = 一个事件在解决方案组中停留了多少小时:
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
如何对这一列求和并显示如下结果:
occnum | groupnamelvl | Total_Hours
------------------------------------------
occ001 | sgrouplevel2 | 260:55:50
我使用它,但它仅适用于数据 mior tahn 24h,结果可能大于 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 的帮助下新代码运行良好,但我无法分组:
SqlCeConnection conn = new SqlCeConnection(@"Data Source=\App_sqlce35\DATA\Database1.sdf");
SqlCeCommand cmdselect = new SqlCeCommand("select [col0], [col1], [col2], from tb_histstatus WHERE [col6] <>'';", conn);
try
{
conn.Open();
SqlCeDataReader res = cmdselect.ExecuteReader();
List<string> times = new List<string>();
while (res.Read())
{
times.Add((string)res.GetValue(2));
}
int[] result = new int[3];
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);
MessageBox.Show("Total: " + resultString);
}
【问题讨论】:
-
该列的数据类型是什么?
-
使用这些值创建一个 DateTime 对象并与之相加。你已经试过了吗?
-
我将其设置为 NVARCHAR,因此我尝试转换和转换,但仅在我的小时数小于 24 并且我得到的结果超过 24 小时但仅在 99:00:00 之前工作
-
将时间的各个部分(小时、分钟和秒)分开并求和呢?您可以使用
string.Split(':')来划分时间。如果不清楚,我可以发布一个示例。 -
在旁注中,结果是
260:55:50,而不是160:55:50。
标签: c# sql-server