C# 如何显示以小时和分钟工作的小时数

C# 如何显示以小时和分钟工作的小时数,c#,sql-server,C#,Sql Server,下面是我的查询和我的c#代码。问题是我需要在hours和min中显示Sum,但是我得到了这个错误aggregate函数Sum()和类型:String。我怎样才能解决它 下面是我到目前为止尝试过的问题 SELECT ID, name,FromDate,ToDate,CAST(DATEDIFF(Minute,FromDate, ToDate) / 60 AS VARCHAR(5)) + ' Hrs' + ':' + RIGHT('0' + CAST(DATEDIFF(Minute, FromDate

下面是我的查询和我的c#代码。问题是我需要在
hours
min
中显示
Sum
,但是我得到了这个错误
aggregate
函数
Sum()
类型: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");

但是什么都不起作用

首先,对于这样的计算,不应该将日期和时间存储为DATETIME。您应该以UTC格式存储此值(自1950年以来的秒数)。然后只计算秒数,这样你就可以得到28383。也就是7小时(25200秒)53分(3180秒)和3秒

若您需要在数据库中显示人类可读的日期时间,那个么您应该使用一个视图来将秒数转换为人类可读的格式

将日期和时间存储为DATETIME还有其他缺点,如优化效果差(整数的计算速度远远快于DATETIME)、客户端计算机上的日期格式问题等等


因此,在像您这样的应用程序中,以秒为单位存储所有日期和时间数据。计算更简单、更快。这不仅仅是我自己的经验,我不久前也读了很多关于SQL优化的书。

与您正在尝试的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;
        }
    }
}

然后对求和执行任何需要的操作。

我认为,聚合函数sum()和Type:String的使用
无效的原因是,在SQL查询中,您将
Hr
列转换为
VARCHAR
。如果你试着把它转换成数字类型,它能工作吗?你能告诉我怎么做吗?选择ID,name,FromDate,ToDate,CAST(DATEDIFF(Minute,FromDate,ToDate)/60作为十进制(15,0))+“Hrs”+:“+右('0'+CAST(DATEDIFF(Minute,FromDate,ToDate)%60作为十进制(2,0)),2)+“Min”作为“Hr”从转换(date,FromDate,101)的记录中)在convert(date,“+FromDate+”,101)和convert(date,“+ToDate+”,101)和Name=“+Name+””之间,将数据类型varchar转换为numeric时出错。问题是Hr列包含类似
3小时:10分钟
的数据。此数据无法转换为双精度。它不工作。我得到的小时数总和为empty@abc设置一些断点并逐步完成它。检查数据表。它有你期望的值吗?如果(Int32.TryParse(dr1[“Hr”].ToString(),out outVal)){sum+=outVal;}@abc哦,我的错误,尝试使用
Decimal.TryParse
Float.TryParse
并将
outVal
更改为相同类型(
Decimal
/
Float
)。它可能不是一个整数,是吗?我正在将我所需的值输入到dt.rows和dr[“Hr”]中,但它不会进入if(float.TryParse(dr[“Hr”].ToString(),out outVal)){sum+=outVal;}我猜这是问这个问题的学校作业,但不管是不是,在许多情况下,将整个数据库模式更改为同时使用不同的类型,然后更改代码以使其适合不是可行的解决方案。它也没有回答如何将时间同时显示为小时和分钟的问题。好吧,但如果这不是学校作业,而是常规申请,那么asker将来在这种结构上会有问题。当我启动我的工作时间应用程序时,我使用DATETIMES启动它。但很快就出现了这样一个坏主意。所以我需要将其更改为ints(在工作数据库上:))。这很难,但结果令人敬畏。“将来可能会有问题”;也许不是。完全取决于应用程序的规模。根据我个人的经验,我从来没有因为在数据库中使用
DateTime
格式而遇到过任何问题,但我很少处理超过10K的记录——即使这样,它通常也不太依赖于与日期字段相关的内容。他们只是为了审计的目的。在任何情况下,并不是每个企业都有资源只说“好吧,我们需要花2个多月的时间来完全重新做我们的数据库和代码,以便进行一些轻微的优化”