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