0
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 格式的数据(example-01:00,12:45,02:59 等)。有没有办法可以从数据集本身。我不想再次从数据库中查询以获取持续时间的总和。

4

1 回答 1

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)中,您还可以使用两列,一列用于 start DateTime,一列用于 end DateTime

于 2012-07-18T14:27:24.610 回答