如何显示小时和分钟的小时数

时间:2017-04-24 12:07:28

标签: c# sql-server

以下是我的查询和我的c#代码问题是我需要在Sumhours中显示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");

但没有任何效果

2 个答案:

答案 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优化的内容。