如何在 c# 中查找两个时间之间的时差

本文关键字:两个 时间 之间 时差 查找 | 更新日期: 2023-09-27 18:33:53

我有一个表格,可以让我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有相同的代码。我不能做的是弄清楚如何找到工作时间?如何在标签或文本框中显示他们的工作时间,如上所示?

如何在 c# 中查找两个时间之间的时差

操作系统中的日期时间类型是简单的整数值,您应该进行算术运算并获取小时数或总小时数:
小时得到差值的整数部分(不要丢失解析文本框):

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;


总小时数获得一个双精度值,其日期时间与日期时间完全不同:

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中完成,您可以执行以下操作 - 同样,您需要将时间转换为日期时间,然后可以使用datediff函数。

请参阅: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 对象放入 using 语句中,以及将值作为参数传递到查询中。 此外,您必须使用 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