如何在c#中找到两次之间的时差

时间:2014-12-09 19:10:47

标签: c# sql database winforms sql-server-2008

我有一张表格,可以给我所有工作人员的time_in和time_out小时。 Time_in和time_out也是sql表。基本上form返回数据库表值。我想做的是显示它们的工作时间。工作时间可以得到从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也有相同的代码。我不能做的是弄清楚如何找工作时间?如何在上面的标签或文本框中显示他们的工作时间?

4 个答案:

答案 0 :(得分:3)

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

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;

答案 1 :(得分:2)

我不知道你是否准备在SQL中做时差,但是在C#中如何做到这一点 - 尽管你需要转换为日期时间对象,不只是一个时间(至少在这个例子中)。

请参阅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

请注意,在上面的示例中,我使用任意日期来完成创建有效日期时间

答案 2 :(得分:2)

您可以使用以下几分钟获得时差:

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

答案 3 :(得分:2)

您应该可以在一个查询中执行此操作。这也显示了处理ADO.Net的最佳实践,包括将sql对象放入using语句并将值作为参数传递给查询。此外,您必须使用ExecuteReader来获取多个值,并且可以添加检查以检索多于或少于一行。

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
            }
        }
    }
}