以下是我的查询和我的c#代码问题是我需要在Sum
和hours
中显示min
,但我收到此错误aggregate
的使用无效函数Sum()
和Type: String
。我该如何解决?
以下是我迄今为止尝试的查询
SELECT ID, name,FromDate,ToDate,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' FROM records WHERE convert(date,FromDate,101)
between convert(date,'" + FromDate + "',101) and
convert(date,'" + ToDate + "',101) and Name = '" + Name + "'
这是代码
DataTable Dt = adm.GetTeamActivityByNameDates(FromDate.ToString(), ToDate.ToString(), ddlUser.SelectedValue);
if (Dt.Rows.Count > 0)
{
int sum = Convert.ToInt32(Dt.Compute("SUM(Hr)", string.Empty));
string Noofact = Dt.Rows.Count.ToString();
DataTable dtFinal = new DataTable();
dtFinal.Columns.Add("Number");
dtFinal.Columns.Add("Sum");
DataRow dr = dtFinal.NewRow();
dr["Number"] = Noofact;
dr["Sum"] = sum;
dtFinal.Rows.Add(dr);
dtFinal.AcceptChanges();
if (Dt.Rows.Count > 0)
{
grdACT.DataSource = dtFinal;
grdACT.DataBind();
}
else
{
}
我试过
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");
但没有任何效果
答案 0 :(得分:0)
类似于LINQ尝试的替代解决方案很简单:
float sum = 0;
float outVal = 0;
foreach (DataRow dr in dt.Rows)
{
if (!String.IsNullOrEmpty(dr["Hr"].ToString()))
{
if (float.TryParse(dr["Hr"].ToString(), out outVal))
{
sum += outVal;
}
}
}
然后随心所欲地做你需要的任何事情。
答案 1 :(得分:-1)
首先,您不应将日期和时间存储为DATETIME - 用于此类计算。您应该以UTC格式(自1950年以来的秒数)存储此值。然后只计算秒数,所以你可以得到像28383这样的东西。这是7小时(25200秒)53分钟(3180秒)和3秒。
如果您需要显示人类可读的日期时间IN DATABASE,您应该使用一个视图,将秒数转换为人类可读的格式。
存储日期和时间为DATETIME还有其他缺点,例如优化不佳(整数计算比DATETIME快得多),客户端计算机上的日期格式问题等等。
因此,在像您这样的应用程序中 - 以秒为单位存储所有日期和时间数据。计算更简单,更快捷。这不仅取决于我自己的经验,而且我前段时间已经阅读了很多关于SQL优化的内容。