C# 从数据集中以HH:MM格式获取总计

C# 从数据集中以HH:MM格式获取总计,c#,asp.net,C#,Asp.net,从上面的存储过程中,我填充了一个数据集。之后,我将这个数据集绑定到一个网格视图。 在数据集中,列Duration包含HH:MM格式的数据(例如-01:00、12:45、02:59等)。是否有方法可以从数据集本身获取HH:MM格式的总Duration。我不想再次从数据库查询以获取Duration的总和。如果您至少使用SQL Server 2008,您应该使用Time数据类型来表示.NETTimeSpan 为了让它与varchar列一起工作,我将使用Linq To DataSet,例如: CREAT

从上面的存储过程中,我填充了一个数据集。之后,我将这个数据集绑定到一个网格视图。
在数据集中,列Duration包含HH:MM格式的数据(例如-01:00、12:45、02:59等)。是否有方法可以从数据集本身获取HH:MM格式的总Duration。我不想再次从数据库查询以获取Duration的总和。

如果您至少使用SQL Server 2008,您应该使用
Time
数据类型来表示.NET
TimeSpan

为了让它与varchar列一起工作,我将使用
Linq To DataSet
,例如:

CREATE procedure St_Proc_GetUserReportforCurrentDayTask                        
@userID int                        
as                        
    Begin                        
        set NoCount on;                        
        DECLARE @TODAY DATE                          
        SET @TODAY = CONVERT(VARCHAR(10), GETDATE(), 111)                        
        select  CONVERT(VARCHAR,production.CalendarDate,101) + RIGHT (CONVERT(VARCHAR,production.CalendarDate , 100 ) ,7) as Date,                         
        RegionAndProjectInfo.RegionProjectName as Region ,                        
        County.CountyName as County,                        
        WorkType.WorkTypeName as WorkType,                        
        Task.TaskName as Task,            
        Production.VolumeProcessed as 'Volumes Processed',                        
        Production.TimeSpent as 'Duration'                        
        from Production                         
        inner join RegionAndProjectInfo                        
        on                        
        RegionAndProjectInfo.RegionProjectID=Production.RegionProjectID                        
        inner join County                        
        on                         
        County.CountyID=Production.CountyID                        
        inner join WorkType                        
        on                        
        WorkType.WorkTypeID=Production.WorkTypeID                        
        inner join Task                        
        on                        
        Task.TaskID=Production.TaskID                        
        where Production.UserID=@userID and CalendarDate >= @TODAY                        
    End 
var timeSpans=dataSet.Tables[0].AsEnumerable()
.选择(r=>new{
DurHour=r.Field(“Duration”).Split(“:”)[0],
DurMinute=r.Field(“持续时间”).Split(“:”)[1]
})
.Select(x=>newtimespan(int.Parse(x.DurHour)、int.Parse(x.DurMinute)、0);
WriteLine(“以分钟为单位的总时间:{0}”,timeSpans.Sum(ts=>ts.TotalMinutes));
但这只是一个解决方法,实际上您应该真正避免在varchar列中存储时间跨度,只对文本使用varchar,而不使用其他内容


在SQL Server 2005(或其他dbms)中,您还可以使用两列,一列用于开始
DateTime
,另一列用于结束
DateTime

,因此duration是一个varchar字段?是的。我使用duration作为varchar,因为它具有HH:Mm格式的数据。示例01:00,12:45,02:59 etcOk,那么我的答案应该对您有帮助,是吗?这是我第一次使用Linq,现在在阅读后也有了一些想法。非常感谢我认识到Linq的重要性,我已经开始学习它。
var timeSpans = dataSet.Tables[0].AsEnumerable()
    .Select(r => new {
        DurHour   = r.Field<String>("Duration").Split(':')[0],
        DurMinute = r.Field<String>("Duration").Split(':')[1]
    })
    .Select(x => new TimeSpan(int.Parse(x.DurHour), int.Parse(x.DurMinute), 0));

Console.WriteLine("Total time in minutes: {0}", timeSpans.Sum(ts=>ts.TotalMinutes));