从数据集中获取HH:MM格式的总计

时间:2012-07-18 14:15:05

标签: c# asp.net

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 

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

1 个答案:

答案 0 :(得分:1)

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

要使用varchar-column,我会使用Linq-To-DataSet,例如:

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));

但这只是一种解决方法,实际上你应该避免在varchar列中存储一个时间跨度,仅将varchar用于文本而不是其他任何内容。

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