Как найти временные разницы между двумя моментами в c #

У меня есть форма, которая дает мне time_in и time_out часов всех сотрудников. Time_in и time_out также таблицы sql. В основном форма возвращает значения таблицы базы данных. То, что я хотел бы сделать, – показать рабочий час. Рабочий час может быть получен с отличием от time_out до time_in. У меня есть два текстовых поля, отображающих время и Time_out. Третий должен отображать рабочий час.

Вот что я имею для значения time_out для среды:

//Selected TimeOutWednesday SqlCommand TimeOutWednesdayMain = cs.CreateCommand(); TimeOutWednesdayMain.CommandText = "SELECT CONVERT(VARCHAR(8), time_out, 108) AS time_out FROM job_punch_card WHERE emp_key='" + listBoxNames.SelectedValue.ToString() + "'and punch_day= DATEADD(week, DATEDIFF(day, 0, getdate())/7, 2)"; Object TimeOutWednesdayMainTemp = TimeOutWednesdayMain.ExecuteScalar(); txtTimeInWed.Text = TimeOutWednesdayMainTemp.ToString(); 

Этот код дает мне time_out в среду для выбранного пользователя из моего списка. У меня есть тот же код для time_in. Что я не мог сделать, так это выяснить, как найти рабочий час? Как я могу показать свой рабочий час в ярлыке или текстовом поле, как у меня выше?

Типы DateTime в ОС являются целыми значениями Integer, вы должны сделать арифметическую операцию и получить часы или TotalHours:
Часы получают целую часть разницы (не теряйте разбор текстовых полей):

 DateTime time_in; DateTime.TryParse(time_in_TextBox.Text, out time_in); DateTime time_out; DateTime.TryParse(time_out_TextBox.Text, out time_out); int hours = (time_in - time_out).Hours; 

TotalHours получают двойное значение с точной разницей в DateTimes:

 DateTime time_in; DateTime.TryParse(time_in_TextBox.Text, out time_in); DateTime time_out; DateTime.TryParse(time_out_TextBox.Text, out time_out); double totalHours = (time_in - time_out).TotalHours; 

Я не знаю, если вы настроились на разницу во времени в SQL, но вот как вы можете это сделать на C # – хотя вам нужно будет преобразовать объект datetime, а не просто время (по крайней мере, в этом примере) ,

См. https://dotnetfiddle.net/DSuHmH :

 using System; public class Program { public static void Main() { DateTime startTime = new DateTime(2014, 1, 1, 1, 5, 1); DateTime endTime = new DateTime(2014, 1, 1, 5, 10, 55); TimeSpan ts = endTime - startTime; Console.WriteLine(ts); // returns "04:05:54" } } 

специально для использования часов:

 ts.Hours; 

Чтобы выполнить в sql, вы можете сделать что-то вроде следующего – снова вам нужно будет преобразовать свое время в datetime, а затем вы можете использовать функцию датиффа.

См .: http://sqlfiddle.com/#!6/b7a7c/7

 select convert(datetime, '2014-01-01 ' + startTime, 101), convert(datetime, '2014-01-01 ' + endTime, 101), datediff( hh, convert(datetime, '2014-01-01 ' + startTime, 101), convert(datetime, '2014-01-01 ' + endTime, 101) ) from test 

Обратите внимание, что в приведенных выше примерах я использую произвольную дату для создания действительного дата-времени

Вы должны сделать это в одном запросе. Это также показывает лучшие практики работы с ADO.Net, включая размещение ваших объектов sql в использовании операторов и передачу значений в ваш запрос в качестве параметра. Кроме того, вам нужно будет использовать ExecuteReader для получения более одного значения обратно, и вы можете добавить проверку на получение более или менее 1 строки.

 using (var cs = new SqlConnection("your connection string")) { cs.Open(); using (var command = cs.CreateCommand()) { command.CommandText = @"SELECT time_in, time_out, DATEDIFF(minute, time_in, time_out) As minutesWorked FROM job_punch_card WHERE emp_key=@EMPKEY and punch_day= DATEADD(week, DATEDIFF(day, 0, getdate())/7, 2)"; command.Parameters.AddWithValue( "@EMPKEY", listBoxNames.SelectedValue.ToString()); using (var reader = command.ExecuteReader()) { if (!reader.HasRows) { // There was no match for your key } reader.Read(); DateTime timeIn = reader.GetDateTime(0); DateTime timeOut = reader.GetDateTime(1); int minutesWorked = reader.GetInt32(2); if (reader.Read()) { // There was more than one match on key } } } } 

Вы можете получить разницу во времени за несколько минут, используя это:

 DATEDIFF(MINUTE, @punch_day, @time_out) 

Это вернет общие минуты между двумя датами. Если вам нужны часы, разделите его на 60 . Если вам нужны дни, разделите их на (60*24) . Если вам нужны недели, разделите его на (60*24*7) . Если вам нужны годы, разделите его на (60*24*365) . Надеюсь, вы получите эту идею!

Проверьте этот пример:

 DECLARE @StartDate DATETIME DECLARE @EndDate DATETIME SELECT @StartDate = '12/9/2014 11:04am' SELECT @EndDate = '12/10/2014 1:38pm' SELECT DATEDIFF(MINUTE, @StartDate, @EndDate) AS TotalMinutes, DATEDIFF(MINUTE, @StartDate, @EndDate) / 60 AS TotalHours, DATEDIFF(MINUTE, @StartDate, @EndDate) / (60*24) AS TotalDays