Расчет DateTime с LINQ to SQL - PullRequest
       0

Расчет DateTime с LINQ to SQL

1 голос
/ 17 августа 2010

У меня есть две таблицы TimeSheet и TimeRecord.TimeRecord имеет внешний ключ TimeSheetId из TimeSheet.Следующие журналы времени взяты из TimeRecord,

Пример данных TimeSheet:

TimeSheetId, StudentId

  187 , 10
  196 , 11
  195 , 12

Пример данных TimeRecord:

TimeRecordId  TimeSheetId       TimeIn                 TimeOut

   1             187    8/17/2010 1:06:55 PM    8/17/2010   1:53:49 PM

   2             196    8/17/2010 1:31:28 PM    8/17/2010   4:59:58 PM
   3             187    8/17/2010 1:51:40 PM    8/17/2010   4:59:02 PM
   4             187    8/17/2010 2:13:35 PM    8/17/2010   5:00:08 PM
   5             196    8/17/2010 2:19:44 PM    8/17/2010   5:00:14 PM
   6             196    8/17/2010 2:23:02 PM    8/17/2010   4:46:00 PM
   7             195    8/17/2010 3:04:15 PM    8/17/2010   4:58:34 PM

Я хотел бы получить общее время, потраченноекаждого студента.Таким образом, результат будет примерно таким:

  10 has 10hr 30mn 5sec 
  11 has 8hr 45mm 23sec
  12 has 2hr 33mn 25sec

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 17 августа 2010

Вы можете просто вычесть одну дату из другой.Это даст вам объект TimeSpan .Затем вы можете использовать метод ToString объекта TimeSpan, чтобы отобразить затраченное время, как хотите, используя стандартные строки формата TimeSpan .Вы могли бы выглядеть примерно так:

TimeSpan timeSpent = studentTimeRecord.TimeOut - studentTimeRecortd.TimeIn; 
string displayTime = timeSpent.ToString("[hh]hr [mm]mn [ss]sec");

Обновление: я только что понял, что не рассматривал вопрос группировки студентов и суммирования по группировке.Я отложу ответ Джона за это.

1 голос
/ 17 августа 2010

Я думаю, это то, что вы пытаетесь архивировать:

    Dim query = From ts In db.TimeSheet _
                 Join tr In db.TimeRecord On tr.TimeSheetId Equals ts.TimeSheetId _
                 Group By ts.StudentId, tr.TimeSheetId Into TotalTime = Sum(DateDiffSecond(tr.TimeIn, tr.TimeOut)) _
                 Select StudentId, TimeSheetId, TotalTime

    Dim timespan As TimeSpan
    Dim formattedTimeSpan As String

    For Each q In query

        timespan = timespan.FromSeconds(q.TotalTime)
        formattedTimeSpan = String.Format("{0} hr {1} mm {2} sec", Math.Truncate(timespan.TotalHours), timespan.Minutes)
        Response.Write("Student " & " " & q.StudentId & " has " & q.TimeSheetId & " : " & formattedTimeSpan & "<br/>")

    Next

Вам необходимо импортировать SqlMethods:

Imports System.Data.Linq.SqlClient.SqlMethods

ТакжеПроверить:

1 голос
/ 17 августа 2010

Ну, я не знаю, насколько хорошо это будет работать, но я бы по крайней мере попробовал :

var query = from record in db.TimeRecords
            group record by record.TimeSheetId into g
            select new { id = g.Key, 
                         TotalTime = g.Sum(x => x.TimeOut - x.TimeIn) } into t
            join student in db.TimeSheets
            on t.id equals student.TimeSheetId
            select new { student.StudentId, t.TotalTime };

Это действительно зависит от того, рад ли LINQ to SQLвычтите один DateTime из другого, а затем суммируйте результаты этого для нескольких записей.(Если это работает, TotalTime должно закончиться как TimeSpan.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...