0

LINQクエリを使用せずにデータセットから列の合計を取得する方法はありますか?

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 

上記のストアドプロシージャから、データセットに入力しています。その後、このデータセットをグリッドビューにバインドします。データセットの列Durationには、HH:MM形式のデータが含まれています(例-01:00、12:45、02:59など)。データセット自体からフォーマットで合計を取得する方法はありDurationますか?のを取得するためにHH:MMデータベースから再度クエリを実行したくありません。この質問はすでにここに投稿しましたが、解決策は、使用したくないLINQクエリを使用することでした。SUMDuration

4

2 に答える 2

0

なぜ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);
于 2012-07-18T16:53:23.440 に答える
0

DataTable.Computeメソッドを使用して合計を行うことはできますが、期間をHH:MMとして処理する方法がわかりません。SELECTに、HH:MMを数値型に変換する別の列を指定し、合計後にコードでHH:MMに変換し直す必要があります。

データベーススキーマを変更できる場合は、期間をintまたはbigint列にティックとして格納します。これにより、.NET側でTimeSpanに簡単に変換できます。また、SQLで合計と範囲のチェックをより簡単に実行できます。SQLでTimeSpansをティックとの間で変換できるようにする必要がある場合は、以下で説明した関数を使用できます。回答を送信するには、ランダムなアンダースコア(_)文字を挿入する必要がありました。(何らかの理由で、それらがないとタイムアウトを節約できます。)コードを機能させるには、それらを削除する必要があります。申し訳ありません。

時間文字列の文字列表現からティックを取得するには、次のようにします。

/*
[-][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

ティックからTimeSpanの文字列表現を取得するには:

/*
[-][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
于 2012-07-18T16:55:36.357 に答える