C# 在不使用Linq的情况下,使用C以时间格式(HH:MM)从数据集中获取列的总数
有没有一种方法可以不使用LINQ查询就从数据集中获取列的总数C# 在不使用Linq的情况下,使用C以时间格式(HH:MM)从数据集中获取列的总数,c#,asp.net,C#,Asp.net,有没有一种方法可以不使用LINQ查询就从数据集中获取列的总数 CREATE procedure St_Proc_GetUserReportforCurrentDayTask @userID int as Begin set NoCount on;
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格式的持续时间总和?我不想再次从数据库中查询以获取持续时间的总和。我已经发布了这个问题,但解决方案是使用LINQ查询,我不想使用它。我很好奇为什么您不想使用LINQ,但我离题了 这是一个使用循环的un-linq-y版本:
double total = 0;
foreach(DataRow r in dataSet.Tables[0].Rows)
{
var DurHour = r["Duration"].ToString().Split(':')[0];
var DurMinute = r["Duration"].ToString().Split(':')[1];
TimeSpan ts = new TimeSpan(int.Parse(DurHour), int.Parse(DurMinute), 0);
total += ts.TotalMinutes;
}
Console.WriteLine("Total time in minutes: {0}", total);
您可以使用进行求和,但是,它不知道如何将持续时间处理为HH:MM。您需要在SELECT中提供另一个列,将HH:MM转换为数字类型,然后在求和后将其转换回代码中的HH:MM
如果可以更改数据库模式,我会将持续时间存储为int或bigint列中的记号。这使您可以轻松地在.NET端转换为时间跨度。它还允许您更轻松地在SQL中执行求和和和范围检查。如果您需要能够在SQL中将时间跨度转换为刻度,也可以使用我编写的以下函数。我不得不插入一些随机的下划线字符以获得要提交的答案。出于某种原因,在没有它们的情况下节省时间。需要删除它们才能使代码正常工作。很抱歉
要从时间字符串的字符串表示形式中获取刻度,请执行以下操作:
/*
[-][d.]hh:mm:ss[.fffffff]
"-"
A minus sign, which indicates a negative time interval. No sign is included for a positive time span.
"d"
The number of days in the time interval. This element is omitted if the time interval is less than one day.
"hh"
The number of hours in the time interval, ranging from 0 to 23.
"mm"
The number of minutes in the time interval, ranging from 0 to 59.
"ss"
The number of seconds in the time interval, ranging from 0 to 59.
"fffffff"
Fractional seconds in the time interval. This element is omitted if the time interval does not include fractional seconds. If present, fractional seconds are always expressed using seven decimal digits.
*/
CREATE FUNCTION [dbo].[ParseTimeSpanString]
(
@timespan varchar(26)
)
RETURNS INT
AS
BEGIN
DECLARE @hourStart int
DECLARE @minuteStart int
DECLARE @secondStart int
DECLARE @ticks bigint
SET @hourStart = CHAR INDEX('.', @timeSpan) + 1
SET @minuteStart = CHAR INDEX(':', @timeSpan) + 1
SET @secondStart = CHAR INDEX(':', @timespan, @minuteStart) + 1
SET @ticks = 0
IF (@hourStart < @minuteStart)
BEGIN
SET @ticks = CON_VERT(int, LEFT(@timespan, @hourstart - 2)) * 864000000000
END
ELSE
BEGIN
SET @hourStart = 1
END
SET @ticks = @ticks + CON_VERT(int, SUBSTRING(@timespan, @hourStart, @minuteStart - @hourStart - 1)) * 36000000000
SET @ticks = @ticks + CON_VERT(int, SUBSTRING(@timespan, @minuteStart, @secondStart - @minuteStart - 1)) * 600000000
SET @ticks = @ticks + CON_VERT(decimal(9,7), SUBSTRING(@timespan, @secondStart, LEN(@timeSpan) - @secondStart)) * 10000000.0
RETURN @ticks
END
GO
要从刻度中获取时间跨度的字符串表示形式,请执行以下操作:
/*
[-][d.]hh:mm:ss[.fffffff]
"-"
A minus sign, which indicates a negative time interval. No sign is included for a positive time span.
"d"
The number of days in the time interval. This element is omitted if the time interval is less than one day.
"hh"
The number of hours in the time interval, ranging from 0 to 23.
"mm"
The number of minutes in the time interval, ranging from 0 to 59.
"ss"
The number of seconds in the time interval, ranging from 0 to 59.
"fffffff"
Fractional seconds in the time interval. This element is omitted if the time interval does not include fractional seconds. If present, fractional seconds are always expressed using seven decimal digits.
*/
CREATE FUNCTION [dbo].[GetTimeSpanString]
(
@ticks bigint
)
RETURNS varchar(26)
AS
BEGIN
DECL_ARE @timeSpanString varchar(26)
IF @ticks < 0
BEGIN
SET @timeSpanString = '-'
END
ELSE
BEGIN
SET @timeSpanString = ''
END
SET @ticks = ABS(@ticks)
-- Days
SET @timeSpanString = @timeSpanString + CON_VERT(varchar(26), FLOOR(@ticks / 864000000000.0)) + '.'
SET @ticks = @ticks % 864000000000
-- Hours
SET @timeSpanString = @timeSpanString + CON_VERT(varchar(26), FLOOR(@ticks / 36000000000.0)) + ':'
SET @ticks = @ticks % 36000000000
-- Minutes
SET @timeSpanString = @timeSpanString + CON_VERT(varchar(26), FLOOR(@ticks / 600000000.0)) + ':'
SET @ticks = @ticks % 600000000
--Seconds
DECLARE @seconds decimal(9,7)
SET @seconds = @ticks / 10000000.0
SET @timeSpanString = @timeSpanString + CON_VERT(varchar(26), @seconds)
RETURN @timeSpanString
END
GO
所以你不是林克人。。。坏用户!是的:今天我也意识到了Linq的重要性。计划尽快接受培训请注意,您没有理由不使用LINQ。不要混淆LINQ和LINQtoSQL。您可以在数据集上使用LINQ to对象,并且仍然拥有存储过程。非常感谢。现在我的问题通过使用您的代码解决了,我已经开始学习Linq,因为我不想成为一个糟糕的程序员。