我正在创建一款考勤应用程序,我正在寻找一种方法来检查员工的出勤记录是否在他们计划的时间内一个小时之内。
假设员工1的计划是2019年1月31日@ 00:30,但他提前到达并且在记录中签到,因此他的记录显示他在2019年1月30日@ 23:45签到。所以我正在尝试找到如果员工在计划时间的前一个小时或后一个小时内登录,则该时间将作为他的登录时间。例如他可以在2019年1月30日23:30至2019年1月31日01:30之间登录。
目前我有4个DateTime变量来处理这些,但似乎不起作用。
以下是我的Employee类:
所以这是我填充员工时间表的代码:
这是我当前用来填充数据网格的LINQ语句。
这是我的员工排班表: 这是我的员工考勤记录: 如您所见,我添加了4个额外的DateTime变量来处理额外或减少的工作小时数,但仍然无法正常工作,而我不知道为什么。
这是当前的输出: 所以因为我的条件,我缺少一些数据,这应该可以正常工作,但却产生错误的输出。
有什么想法吗?
任何能帮助我的答案都将是极好的。谢谢!
假设员工1的计划是2019年1月31日@ 00:30,但他提前到达并且在记录中签到,因此他的记录显示他在2019年1月30日@ 23:45签到。所以我正在尝试找到如果员工在计划时间的前一个小时或后一个小时内登录,则该时间将作为他的登录时间。例如他可以在2019年1月30日23:30至2019年1月31日01:30之间登录。
目前我有4个DateTime变量来处理这些,但似乎不起作用。
以下是我的Employee类:
public class Emp1
{
public int ID { get; set; }
public DateTime In { get; set; }
public DateTime Out { get; set; }
public DateTime dateTime1 { get; set; }
public DateTime dateTime2 { get; set; }
public DateTime dateTime3 { get; set; }
public DateTime dateTime4 { get; set; }
}
我的实际出勤日志课程
public class Actual
{
public int ID { get; set; }
public DateTime ActualLog { get; set; }
public int LogStatus { get; set; }
public DateTime date { get; set; }
}
所以这是我填充员工时间表的代码:
List<Emp1> em = new List<Emp1>();
foreach (DataRow row in empContainer.Rows)
{
em.Add(new Emp1()
{
ID = Convert.ToInt32(row[0].ToString()),
In = Convert.ToDateTime(row[1].ToString()),
Out = Convert.ToDateTime(row[2].ToString()),
dateTime1 = Convert.ToDateTime(row[1].ToString()).AddHours(1),
dateTime2 = Convert.ToDateTime(row[1].ToString()).AddHours(-1),
dateTime3 = Convert.ToDateTime(row[2].ToString()).AddHours(1),
dateTime4 = Convert.ToDateTime(row[2].ToString()).AddHours(-1)
});
}
这是我当前用来填充数据网格的LINQ语句。
public void Main()
{
List<Emp1> emps;
List<Actual> actuals;
actuals = emp.GetActual(@"C:\Users\IT\Desktop\Sample\SampleActual.dat");
emps = GetEmpSched();
var final = (from a1 in actuals
join a2 in actuals on a1.ID equals a2.ID
join t1 in emps on a1.ID equals t1.ID
join t2 in emps on a2.ID equals t2.ID
where ((a1.LogStatus == 0) && (a2.LogStatus == 1)) && ((t1.In == t2.In) && (t1.Out==t2.Out)) && ((t1.dateTime1 > a1.ActualLog) && (a1.ActualLog > t1.dateTime2)) && ((t2.dateTime3 > a2.ActualLog) && (a2.ActualLog > t2.dateTime4))
select new
{
User_ID = t1.ID,
Scheduled_In = t1.In,
Actual_Login = a1.ActualLog,
Scheduled_Out = t2.Out,
Actual_Out = a2.ActualLog
}).Distinct(). ToList();
tbContainer = StaticClasses.ToDataTable(final);
dgvAttendance.ItemsSource = emp.CalculateEmployeeAttendance(tbContainer);
}
这是我的员工排班表: 这是我的员工考勤记录: 如您所见,我添加了4个额外的DateTime变量来处理额外或减少的工作小时数,但仍然无法正常工作,而我不知道为什么。
这是当前的输出: 所以因为我的条件,我缺少一些数据,这应该可以正常工作,但却产生错误的输出。
有什么想法吗?
任何能帮助我的答案都将是极好的。谢谢!