[英]How to display hours worked with hours and minutes
下面是我的查询和我的C#代码,问题是我需要以hours
和min
为单位显示Sum
,但是我收到此错误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");
但是什么都没用
与您尝试使用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;
}
}
}
然后,用总和做任何您需要的事情。
首先,您不应该将日期和时间存储为DATETIME-这样的计算。 您应该以UTC格式(自1950年以来的秒数)存储此值。 然后仅计算秒数,那么您将得到类似于28383的信息。这是7小时(25200秒),53分钟(3180秒)和3秒。
如果需要在数据库中显示人类可读的日期时间,则应使用将秒数转换为人类可读格式的视图。
将日期和时间存储为DATETIME还具有其他缺点,例如优化不佳(整数计算比DATETIME上的计算要快得多),客户端计算机上日期格式的问题等等。
因此,在像您这样的应用程序中-以秒为单位存储所有日期和时间数据。 计算更加简单快捷。 这不仅是基于我自己的经验,而且我前一段时间已经阅读了很多有关SQL优化的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.