我从我的 SQL 查询中返回了一些记录集,其中我获得了员工姓名以及他当月休假的开始和结束日期。我的问题是我得到了同一员工的两条记录,但休假日期不同。现在我想要该员工休假时的所有日期(应该结合他的休假数据)。
我的 SQL 查询是:
SELECT distinct emp.emp_name,
NULL as start_date,
NULL as end_date
FROM employee_details emp
WHERE emp.group_name = 'A' and
Emp_Id not in (SELECT distinct emp.Emp_Id
FROM employee_details emp, offshore_leave_calendar olc
WHERE emp.emp_id = olc.emp_id AND
emp.group_name = 'A' and
datepart(mm,olc.start_date) = datepart(mm, getdate()))
union
SELECT distinct emp.emp_name,
olc.Start_Date,
olc.End_Date
FROM employee_details emp, offshore_leave_calendar olc
WHERE emp.emp_id = olc.emp_id AND
emp.group_name = 'A' and
datepart(mm, olc.start_date) = datepart(mm,getdate())
我上面查询的输出是:
Emp_Name start_date end_date
John
Sophia
Olivia
Davis 3/20/2017 12:00:00 AM 3/24/2017 12:00:00 AM
Clark 3/21/2017 12:00:00 AM 3/24/2017 12:00:00 AM
Paul
Thomas 3/21/2016 12:00:00 AM 3/29/2016 12:00:00 AM
Thomas 3/6/2017 12:00:00 AM 3/10/2017 12:00:00 AM
在上面的输出中,Thomas 在本月休了两次假。所以我想要 Thomas 在 C# 列表中休假时的所有日期。输出日期应该是:
3/06/2016
3/07/2016
3/08/2016
3/09/2016
3/10/2016
3/21/2016
3/22/2016
3/23/2016
3/24/2016
3/25/2016
3/26/2016
3/27/2016
3/28/2016
3/29/2016
谁能帮我解决这个问题?
我有一个列表:
List<LeaveData> leaveList = new List<LeaveData>();
其中 LeaveData 类具有以下三个定义:
public string Emp_Name { get; set; }
public DateTime? start_date { get; set; }
public DateTime? end_date { get; set; }
我想在每个月的每个日期分配一名员工,而休假的员工不应分配。所以我循环了一个月的所有日期并编写了这段代码来查找员工休假的日期:
for (int i = 0; i < dates.Length; i++)
{
for (DateTime? date = leaveList[index].start_date; date <= leaveList[index].end_date; date = date.Value.AddDays(1))
{
allDates.Add(date);
}
}
其中索引是从 0 到 7 的计数(在本例中)。索引将指向我从 SQL 查询中获得的任何员工。
最佳答案
假设您有一个用 C# 编写的员工列表
List<Employee> employees = ...
IEnumerable<DateTime> leaveDates =
employees.Where(emp=>emp.Emp_Name == "Thomas")
.SelectMany(emp =>
Enumerable.Range(0, emp.EndDate.Subtract(emp.StartDate).Days + 1)
.Select(d => e.StartDate.AddDays(d)));
解释
这将获取两个日期之间的日期范围:
Enumerable.Range(0, e.EndDate.Subtract(e.StartDate).Days + 1)
.Select(d => e.StartDate.AddDays(d)));
剩下的只是Where
和SelectMany
的简单 linq 是将结果投影并展平到相同的序列中
编辑
作为您的评论:如果您在 leaveList[index]
中有数据,那么您只需将“Thomas”替换为 leaveList[index].Emp_Name
。而且我还添加了空日期检查:
IEnumerable<DateTime> leaveDates =
employees.Where(emp=>emp.Emp_Name == leaveList[index].Emp_Name &&
emp.StartDate.HasValue && emp.EndDate.HasValue)
.SelectMany(emp =>
Enumerable.Range(0,
emp.EndDate.Value.Subtract(emp.StartDate.Value).Days + 1)
.Select(d => e.StartDate.Value.AddDays(d)));
关于c# - C#如何获取员工的总休假数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42620609/