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格式中获取总数数据集本身。我不想再从数据库中查询以获得持续时间的总和。
答案 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
。