2009-07-28 31 views
0

例如,我有一個任務MIS,所述數據爲:如何使用Linq To Sql來計算一天中的空閒工作時間?

ID用戶任務TaskStartTime TaskFinishTime

1麥克TASK1 2009-07-28 9點00分○○秒2009-07-28 9點45: 00

2麥克TASK2 2009-07-28九點30分00秒2009-07-28 9時40分00秒

3麥克TASK3 2009-07-28九點50分00秒2009-07-28 10:30:00

4 Mike task4 2009-07-28 10:20:00 2009-07-28 10:30:00

5邁克任務5 2009-07-28 10:40:00 2009-07-28 11:50:00

我如何使用LINQ to SQL中來清點的空閒時段每天如2009年-07-28?

結果應該是:

5分鐘(之間任務1,任務2和TASK3)+10分鐘

= 15分鐘(task4和任務5之間)

+1

這聽起來像一個家庭作業的問題,你有沒有給你自己解決它一個體面的嘗試證據-1。 – 2009-07-28 22:52:32

回答

1

下面是一些使用Linq來完成工作的代碼。我不知道它是否以您正在尋找的形式出現,但邏輯適用於您提供的數據。你應該能夠重新排列它爲你的應用程序的正確形狀。

改進

var rows = new[] { 
    new { Id = 1, Name="Mike", TaskName="task1", StartTime=DateTime.Parse("2009-07-28 09:00:00"), EndTime=DateTime.Parse("2009-07-28 09:45:00") }, 
    new { Id = 2, Name="Mike", TaskName="task2", StartTime=DateTime.Parse("2009-07-28 09:30:00"), EndTime=DateTime.Parse("2009-07-28 09:40:00") }, 
    new { Id = 3, Name="Mike", TaskName="task3", StartTime=DateTime.Parse("2009-07-28 09:50:00"), EndTime=DateTime.Parse("2009-07-28 10:30:00") }, 
    new { Id = 4, Name="Mike", TaskName="task4", StartTime=DateTime.Parse("2009-07-28 10:20:00"), EndTime=DateTime.Parse("2009-07-28 10:30:00") }, 
    new { Id = 5, Name="Mike", TaskName="task5", StartTime=DateTime.Parse("2009-07-28 10:40:00"), EndTime=DateTime.Parse("2009-07-28 11:50:00") }, 
     }; 

var ranges = rows.Select(x => new { StartTime = x.StartTime, EndTime = x.EndTime }); 
int rangeCount = 0; 
while (ranges.Count() != rangeCount) 
{ 
    rangeCount = ranges.Count(); 
    ranges = ranges.Select(x => new { 
     StartTime = ranges.Where(y => (y.StartTime <= x.StartTime && y.EndTime >= x.StartTime) || (y.StartTime <= x.EndTime && y.EndTime >= x.EndTime)).Min(y => y.StartTime), 
     EndTime = ranges.Where(y => (y.StartTime <= x.StartTime && y.EndTime >= x.StartTime) || (y.StartTime <= x.EndTime && y.EndTime >= x.EndTime)).Max(y => y.EndTime), 
    }).Distinct().ToList(); // ToList required to avoid recursion issues 
} 

TimeSpan gapTime = ranges.Max(x => x.EndTime) - ranges.Min(x => x.StartTime) - new TimeSpan(ranges.Sum(x => (x.EndTime - x.StartTime).Ticks)); 

System.Diagnostics.Trace.WriteLine(gapTime); 
-1

像這樣

假設您有一組任務對象:

public class Task 
{ 
    public Guid ID { get; set; } 
    public string User { get; set; } 
    public string Task { get; set; } 
    public DateTime TaskStartTime { get; set; } 
    public DateTime TaskFinishTime { get; set; } 
} 

var tasks = new List<Task>(); 
// Fill tasks here... 

var idleTimeInMinutes = 
    tasks.Last().TaskFinishTime.Subtract (tasks.First().TaskStartTime).Minutes 
    - tasks.Sum (t => t.TaskFinishTime.Subtract (t.TaskStartTime).Minutes); 

編輯:現在,等等,我看到您的示例中的任務重疊。然後我寫的是不會工作的。我將不得不考慮它...

0

好的,我已經制定了一個可行的選項。

您可以使用此:

from a in Tasks 
join b in Tasks on true equals true 
where a.TaskStartTime < b.TaskFinishTime 
where a.TaskFinishTime > b.TaskStartTime 
where a.Id < b.Id 
select new { 
    Id = a.Id, 
    User = a.User, 
    Task = (a.Task + " + " + b.Task), 
    TaskStartTime = (a.TaskStartTime < b.TaskStartTime ? a.TaskStartTime : b.TaskStartTime), 
    TaskFinishTime = (a.TaskFinishTime > b.TaskFinishTime ? a.TaskFinishTime : b.TaskFinishTime) 
} 

到了崩潰下的各個任務,直到沒有交叉點,那麼就採取所有時間的總和,減去的時間在所有任務的總和。

+0

謝謝。我在等你的好消息。 – Mike108 2009-07-28 13:42:02

+0

如果task1是:start = 2009-07-28 09:00:00 end = 2009-07-28 09:51:00結果有問題。 – Mike108 2009-07-28 14:12:36

0

將有趣的記錄拉入內存並在那裏處理它們(通過將重疊範圍摺疊成單個範圍)。崩潰任務不適合查詢方法,如sql或linqtosql。

相關問題