如何在 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有相同的代码。我不能做的是弄清楚如何找到工作时间?如何在标签或文本框中显示他们的工作时间,如上所示?
操作系统中的日期时间类型是简单的整数值,您应该进行算术运算并获取小时数或总小时数:
小时得到差值的整数部分(不要丢失解析文本框):
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